【问题标题】:Sailsjs: How to populate association after *update* to model?Sailsjs:如何在*更新*模型后填充关联?
【发布时间】:2014-01-31 18:59:12
【问题描述】:

我有以下适用于 indexshowcreate 方法的控制器代码,但是当我包含填充时更新失败 - 这是什么我做错了吗?

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

【问题讨论】:

  • 你想用.populate('profile') 完成什么?抱歉,我是 Sails/Waterline 新手 -- 是否总是需要致电 .populate()

标签: node.js express sails.js waterline


【解决方案1】:

根据documentationupdate 函数接受一个回调,它将更新的记录传递给该回调。 文档中的示例:

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

【讨论】:

  • 代码不起作用...请参阅下面的答案...调整,我会给你信任
【解决方案2】:

Jeremie 您的回答本质上是正确的,但存在一些问题:

  • 更新调用返回然后切片的用户对象不会 有populate函数

  • users 列表进行切片会返回一个列表而不是所需的对象

个人偏好,但我也更喜欢以下使用exec 调用而不是回调的方法。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多