添加 属性 不要使用 JSON 编码

Added property don't get encoded with JSON

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

在我尝试对它进行 JSON 编码之前,该代码一直有效。然后当我的 angular 前端接收到它时,我丢失了 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");
    });
})

async.each 只会遍历它。 设置课程有用户后使用async.map和return课程。 它应该就可以工作了。 ;)

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);
});

问题出在 Sequelize 上,通过更改它的 toJSON 方法并使用 async.map

解决了这个问题

尚未使用 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");
        });
    });

续集问题: https://github.com/sequelize/sequelize/issues/549