Cần giúp hàm lấy dữ liệu từ mongodb (không dùng callback)



  • tình hình là mình đang chuyển từ php qua nodejs.
    mình có một thắc mắc trong nodejs có thể viết hàm đợi và sau đó return csdl đã được lấy ra thông qua 1 hàm được không.
    VD:
    DB.prototype.select = function(table,myobj) {

    if(this.connected)
    this.db.collection(table).find(myobj).toArray(function(err,res){
    return res;
    });
    };

    sau đó trong express:
    app.get('/', function(req, res){
    var test=DB.select("menu",{});
    res.send(test);
    });



  • @Chán-Quá-Đi bạn tìm hiểu async/await/promise nhé, mình ko hiểu đoạn code db của bạn cho lắm. Nhưng về cơ bản dùng callback cực dễ



  • mục đích của mình là viết 3 hàm lấy ra từ cơ sở dữ liệu
    header(chứa header của web),
    main(chứa nội dung web),
    footer(chứa nội dung bên dưới cùng của web)

    và sau đó
    app.get('/', function(req, res){
    var header=get_header();
    var main=get_main();
    var footer=get_footer();
    res.send(header+main+footer);
    });

    khỗ nổi nó không giống php, dữ liệu được lấy sau khi re.send() nên luôn trả về rỗng.
    bạn có thể dùng async/await/promise để viết mẫu cho mình 1 hàm trả về 1 bảng dữ liệu ví dụ bảng "menu" không , làm ơn T.T

    app.get('/', function(req, res){
    var menux=get_menu();
    res.send(menux);
    });
    viết thế này mà nó xuất ra được bảng menu là đc, mình cảm ơn trước T.T



  • @Chán-Quá-Đi : Câu lệnh truy vấn để lấy dữ liệu là bất đồng bộ. Cho nên phải chờ nó trả về kết quả và sẽ trả về thông qua hàm callback truyền vào.

    Các hàm get_header, get_main, get_footer là những hàm bất đồng bộ, bảng thân hàm nó này nó không trả về kết quả liền. Cũng giống như hàm DB.select nó không trả về kết qua liền bởi vì this.db.collection(table).find(myobj).toArray(...) là bất đồng bộ.



  • Promise.all([getHeader, getMain, getFooter])
      .then([header, main, footer] => {
         res.send( );
      })
      .catch()
    

    Cơ bản là có thể dùng Promise và viết thế này



  • Dừng cố làm thế, bạn sẽ làm block cả server của bạn lại đó (mà cố cũng chẳng được đâu, cái module nó viết async mà, để có thể return như trong php bạn vẫn làm, cần có module hỗ trợ sync kiểu như fs.readFileSync ấy). Không giống php apache tạo riêng process cho mỗi request. Nodejs là đơn luồng.
    Tốt nhất bạn nên đọc cái này trước https://www.nodebeginner.org/index-vi.html (20 tr tiếng việt free là đủ, english full search GG)



  • cám ơn mọi người, mình đã làm được bằng async.
    cấu trúc mình đang hướng đến là dùng để viết 1 cấu trúc để seo,url
    vd: khi người dùng vào "domain.com/san-pham-1.html"
    truy cập cơ sở dữ liệu bảng seo_url lấy module từ link trên,id sản phẩm từ link trên làm biến global.
    ví dụ : {"seo_url": "/san-pham-1.html", "module":"product" , "idact":20}
    sau đó hàm get_main lại dựa vào module đc phân tích từ link, mà "eval()" 1 file module được viết theo cấu trúc MVC.
    và khi đó người lập tình cần thêm module mới thì viết thêm 1 file là được,
    còn muốn chỉnh sửa thì vào thư mục module chỉnh sửa.
    xem như gần hoàn tất, chỉ còn trang admin.

    và chỉ dùng 1
    app.use(function(req, res){});
    thay vì mổi trang lại viết
    app.get("/aa",function(req, res){});
    app.get("/bb",function(req, res){});
    app.get("/cc",function(req, res){});

    (-^_^-) cám ơn mọi người


Log in to reply