Sailsjs:如何在* update *之后build立关联模型?
我有以下控制器代码适用于索引 , 显示 , 创build方法,但更新失败,当我包含填充 – 我做错了什么?
// User List index: function(req, res) { User.find() .populate('profile') .exec(function(err, users) { if (err) return res.json(err, 400); if (!users) return res.json(users, 404); res.json(users, 200); }); }, // Single User show: function(req, res) { User.findOne({ username: req.param('username') }) .populate('profile') .exec(function(err, user) { if (err) return res.json(err, 400); if (!user) return res.json(user, 404); res.json(user, 200); }); }, // Create User create: function(req, res) { User.create(req.body, function(err, user) { if (err) return res.json(err, 400); Person.create({user: user.id, slug: user.username}, function(err, profile) { if (err) return res.json(err, 400); User.update(user.id, {profile: profile.id}) .populate('profile') .exec(function(err, user) { if (err) return res.json(err, 400); }); user.profile = profile; res.json(user, 200); }); }); }, // Update User update: function(req, res) { var username = req.param('username'); User.update({ username: username }, req.body) .populate('profile') .exec(function(err, user) { if (err) return res.json(err, 400); res.json(user, 201); }); },
根据文档 update
函数采取callback它传递更新的logging。 来自doc的示例:
// For example, to update a user's name, // .update(query, params to change, callback) User.update({ name: 'sally' },{ phone: '555-555-5555' }, function(err, users) { // Error handling if (err) { return console.log(err); // Updated users successfully! } else { console.log("Users updated:", users); } });
应用到你的代码,它看起来像这样:
// Update User update: function(req, res) { var username = req.param('username'); User.update({ username: username }, req.body) .exec(function(err, users) { if (err) { return res.json(err, 400); } var user = users.slice(0,1); // Take the first user in the array User.findOne(user.id) // You may try something like User._model(user) instead to avoid another roundtrip to the DB. .populate('profile') .exec(function(err, user) { if (err) { return res.json(err, 400); } res.json(user, 201); }); }); }
Jeremie你的答案在本质上是正确的,但有几个问题:
-
更新调用返回的用户对象然后切片没有
populate
函数 -
切片
users
列表返回一个列表,而不是所需的对象
个人喜好,但我更喜欢以下使用exec
调用,而不是callback。
update: function(req, res) { var id = req.param('id'); User .update(id, req.params.all()) .exec(function(err, users) { if(err) return res.json(err, 400); var user = users[0]; console.log('ID', user.id); User .findOne(user.id) .populate('profile') .exec(function (err, user){ if (err) return res.json(err, 400); res.json(user, 201); }); }); },