如何在sails.js生命周期回调中访问请求对象?

如何在sails.js生命周期回调中访问请求对象?,sails.js,waterline,Sails.js,Waterline,假设我有这个模型: module.exports = { attributes: { title: { type: 'string', required: true }, content: { type: 'string', required: true }, createdBy: { type: 'string', required: true } } }

假设我有这个模型:

module.exports = {

  attributes: {

    title: {
      type: 'string',
      required: true
    },

    content: {
      type: 'string',
      required: true
    },

    createdBy: {
      type: 'string',
      required: true
    }
  }
}
我需要将当前用户id设置为模型的createdBy属性。我想我可以使用beforeValidate生命周期回调来实现这一点,但我无法访问存储当前用户的请求对象。有没有办法访问它,或者我应该以其他方式解决这个问题

我试过了,但没有成功:

beforeValidate: function (values, next) {
  var req = this.req; // this is undefined
  values.createdBy = req.user.id;
  next();
}

你可以用两种方法来做

首先是将该数据添加到控制器中。差不多

// /api/controllers/mycontroller.js
module.exports = {
    new: function(req, res) {
        if (typeof req.user.id !== 'undefined') {
            req.body.createdBy = req.user.id;     // req.body or req.params
        }
        MyModel.create(req.body /* ... */)
    }
}
如果您对
MyModel
进行了大量的数据操作,这可能会让人恼火。因此,您可以将静态方法添加到模型中,以使用用户id保存它。类似于:

// /api/models/myModel.js
module.exports = {
    attributes: {/* ... */},

    createFromRequest: function(req, cb) {
        // do anything you want with your request
        // for example add user id to req.body
        if (typeof req.user.id !== 'undefined') {
            req.body.createdBy = req.user.id;
        }
        MyModel.create(req.body, cb);
    }
}
以及在控制器中使用它

// /api/controllers/mycontroller.js
module.exports = {
    new: function(req, res) {
        MyModel.createFromRequest(req, function(err, data) {
            res.send(data);
        });
    }
}

由于请求超出了ORM的范围,我猜我的方法是错误的,我需要将createdBy数据添加到中间件内的req.body中。但是,由于不是每个请求都要这样做,我想最好是使用策略。像这样:

PostController: {

  '*': ['passport', 'sessionAuth'],

  create: ['passport', 'sessionAuth',
    function (req, res, next) {
      if (typeof req.body.createdBy === 'undefined') {
        req.body.createdBy = req.user.id;
      }
      next();
    }
  ]
}

这样我就不需要重写蓝图。

谢谢格伦!我试图避免凌驾于蓝图行动之上。但我不知道如果最好怎么办。看看我自己的答案,这有意义吗?@MartinSchaer,我不会把它用于真正的项目。第一个原因是,以这种方式使用策略并不明显。我的意思是,如果我有一个项目,并且知道在保存之前,用户id添加到了请求主体的某个地方,那么策略是我最后一次尝试查找它的地方。第二个原因是很难重用此代码。如果要将用户id添加到模型的其他方法中,则应再次编写此函数(或创建单个策略以添加用户id)。这是我的观点,但我认为策略应该用于访问操作,模型应该用于数据操作。我很惊讶越来越多的人不推荐这样做。始终将其添加到控制器中是蓝图目标的反模式。策略使这变得更容易。好吧,但是我如何能够访问生命周期回调中的req,这要归功于此策略?@AdamPietrasiak这并不能解决这一问题,相反,此“解决方案”建议使用中间件来实现我最初尝试的目标。参见Matt Lo的评论。