2015-02-06 54 views
5

假设我有这种模式:如何访问sails.js生命周期回调中的请求对象?

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

回答

7

由于请求是ORM的范围之内,我猜我的做法是错误的,我需要添加createdBy数据到中间件中的需求。但是,由于这不会为每个请求完成,我猜想用一个策略来做这件事会更好。像这样:

PostController: { 

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

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

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

+1

我很惊讶更多的人不推荐这个。总是将其添加到控制器中是对蓝图目标的反模式。政策使这更容易。 – 2015-07-17 00:37:18

+0

好的,但是我怎么能够通过这个策略访问生命周期回调中的req? – pie6k 2016-01-05 08:15:07

+0

太棒了!这解决了我的问题! – 2016-02-21 13:42:25

1

您可以通过两种方式做到这一点。

首先是将数据添加到控制器中。像

// /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它可能是讨厌的。因此,您可以将静态方法添加到模型中,以便使用用户标识来保存它。喜欢的东西:

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

谢谢格伦!我试图避免重写蓝图行动。但我不知道最好是什么。看看我自己的答案,这有道理吗? – 2015-02-06 18:02:20

+1

@MartinSchaer,我不会将它用于真正的项目。第一个原因,以这种方式使用政策并不明显。我的意思是,如果我有项目,并知道某个地方的用户ID在请求身体保存之前添加了,政策是我尝试查找它的最后一个地方。第二个原因是很难重用这段代码。如果要将用户标识添加到模型的其他方法中,则应该再次编写该函数(或者创建单个策略以添加用户标识)。这是我的看法,但我认为政策应该用于访问操作,模型应该用于数据操作。 – 2015-02-09 09:23:08

-2

Sails有目的地不会将reqres对象暴露给生命周期回调,这意味着您不应该做你想做的事情。

如果您尝试设置用户标识,则可以将该标识添加到sails策略中的req.query对象;那么如果您只使用标准REST端点,则该ID将自动添加到模型中。我的sails-auth模块做了类似的事情。

+0

是的。但是如果我想添加历史追踪到对象呢? 而不是每次都会写入历史部分(例如更新“用户”已更改属性“颜色”的对象) 我唯一想要的是在更新对象后将当前登录用户添加到对象。 即使查询用于当前通话的当前快递网址也会很好。 – 2017-11-12 15:16:46