添加的属性不会使用JSON编码

时间:2015-05-13 12:54:26

标签: node.js sequelize.js

我正在尝试从数据库中获取所有course,然后添加course_has_users(如果存在)。

代码一直有效,直到我尝试JSON编码。然后,当我的角度前端收到它时,我会失去course_has_users

Course.findAll({include: [
    {model:Course_has_material},
    {model:Course_has_competence},
    {model:Organization},
    {model:Module_type},
    {model:Category},
    {model:User, as:'mentor'}
    ],
    where: {organization_id: user.organization_id}
}).then(function (courses) {
    async.each(courses, function (course, callback) {
        Course_has_user.findAll({
            where: {user_id: user.user_id, course_id:course.id}
        }, {}).then(function (course_has_user) {
            course.course_has_users = course_has_user;
            callback();
        })
    }, function (err) {
        onSuccess(courses);
    });
});

路线

.get(function (req, res) {
    var course = Course.build();
    course.retrieveAll(req.user, function (courses) {
        if (courses) {
            res.json(courses);
        } else {
            res.status(401).send("Courses not found");
        }
    }, function (error) {
        res.send("Courses not found");
    });
})

2 个答案:

答案 0 :(得分:1)

async.each将遍历它。 使用async.map并在设置课程后返回课程有用户。 它应该只是工作。 ;)

Course.findAll({include: [
    {model:Course_has_material},
    {model:Course_has_competence},
    {model:Organization},
    {model:Module_type},
    {model:Category},
    {model:User, as:'mentor'}
    ],
    where: {organization_id: user.organization_id}
}).then(function (courses) {
    async.map(courses, function (course, callback) {
        Course_has_user.findAll({
            where: {user_id: user.user_id, course_id:course.id}
        }, {}).then(function (course_has_user) {
            course.course_has_users = course_has_user;
            callback(null, course);
        })
    }, function (err, _courses) {
        // Note that we use the results passed back by async here! 
        onSuccess(_courses);
    });
});

所以你也可以这样做,以简化一些事情

Course.findAll({include: [
    {model:Course_has_material},
    {model:Course_has_competence},
    {model:Organization},
    {model:Module_type},
    {model:Category},
    {model:User, as:'mentor'}
    ],
    where: {organization_id: user.organization_id}
})
.map(function (course) {
      return Course_has_user.findAll({
          where: {user_id: user.user_id, course_id:course.id}
      }, {})
      .then(function (course_has_user) {
        course.course_has_users = course_has_user;
        return course;
      })
    })
    .then(onSuccess);
});

答案 1 :(得分:0)

问题在于Sequelize并通过将其更改为JSON方法并使用async.map

来解决问题

Haven未使用async.each进行测试,但无需使用地图

instanceMethods: {
    toJSON: function () {
        var json = this.values;
        json.course_has_users = this.course_has_users;
        return json;
    },
};

检索方法

retrieveMyCourses: function (user, onSuccess, onError) {
    Course.findAll({include: [
        {model:Course_has_material},
        {model:Course_has_competence},
        {model:Organization},
        {model:Module_type},
        {model:Category},
        {model:User, as:'mentor'}
    ],
        where: {organization_id: user.organization_id}
    }).
        then(function (courses) {
            async.map(courses, function (course, callback) {
                Course_has_user.findAll({
                    where: {user_id: user.user_id, course_id:course.id}
                }, {}).then(function (course_has_user) {
                    course.course_has_users = course_has_user;
                    callback(null, course);
                })
            }, function (err, _courses) {
                var test = JSON.parse(JSON.stringify(_courses));
                onSuccess(_courses);
            });
        });
},

路线

router.route('/api/myCourses')
    // Get all courses
    .get(function (req, res) {
        var course = Course.build();
        course.retrieveMyCourses(req.user, function (courses) {
            if (courses) {
                res.json(courses);
            } else {
                res.status(401).send("Courses not found");
            }
        }, function (error) {
            res.send("Courses not found");
        });
    });

Sequelize问题: https://github.com/sequelize/sequelize/issues/549