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