Khóa học thực chiến

[Help] Sử dụng Promise trong mongoose



  • Các bác cho em hỏi tình huống sử dụng Promise như sau:

    Em có 02 collection trong mongodb là grades và users với schema như sau:

    var gradeSchema = new Schema({
        name: String,
        desc: String
    });
    
    var userSchema = new Schema({
        name: String,
        password: String,
        desc: String,
        idGrade: { type: Schema.Types.ObjectId, ref: 'grade' }
    });
    

    => Mục đích của em là muốn viết query lấy ra danh sách user trong collection users, trong đó mỗi user lấy ra sẽ gồm thông tin grade tương ứng (get theo idGrade). Để làm việc này em dùng populate hoặc aggregate để xử lý nhưng em muốn dùng promise để học hỏi thêm. Em viết đoạn code như dưới đây nhưng khi chạy chỉ hiển ra danh sách user mà không có thông tin gradeObj . Nhờ các bác xem giúp em tại sao với?

    Router.get("/getInfoUser", function (req, res, next) {
        Users.find({})
            .exec()
            .then(users => {
                return Promise.all(users.map(user => {
                    return Grades.findById(user.idGrade)
                        .exec()
                        .then(grade => {
                            user.gradeObj = grade;
                            return user;
                        });
                }));
            })
            .then(dataUsers => {
                res.json(dataUsers);
                res.end();
            });
    });
    

  • Global Moderator

    @mylove1289 Bạn thử chạy bỏ lệnh exec() xem có được ko? Theo tài liệu thì hàm này tạo callback cho kết quả trả về, AFAIK nhưng mình ko chắc đúng, có thể do thằng này ko đảm bảo được promise chain.

    Router.get("/getInfoUser", function (req, res, next) {
        Users.find({})
            .then(users => {
                return Promise.all(users.map(user => {
                    return Grades.findById(user.idGrade)
                        .then(grade => {
                            user.gradeObj = grade;
                            return user;
                        });
                }));
            })
            .then(dataUsers => {
                res.json(dataUsers);
                res.end();
            });
    });
    


  • @Vũ Cảm ơn anh Vũ đã reply, em đã thử nhưng kết quả vẫn như thế, chắc là như anh giải thích rồi. tks anh 🙂


Log in to reply