将数据传递给 sailsjs 中的默认控制器
Passing data to the default controllers in sailsjs
我有一个用户模型和一个小部件模型。我在用户和小部件之间建立了关系。我还为身份验证定义了一个策略,如果用户通过了身份验证,那么我会将用户 ID 保存在 req.session 中。
小部件需要用户:
attributes: {
user: {model: 'user', required: true}
}
有什么方法可以告诉 WidgetController 使用来自身份验证策略的用户并仍然使用蓝图提供的所有默认操作?
是的 :) 您可以使用策略来实现此目的 :)
module.exports = function(req, res, next) {
if(req.session.user){
//then it depends on your implementation but
req.params["widget"].user=req.session.user
//cab be req.query["widget"] or req.body["widget"]
/*
if(req.params["widget"]){
req.params["widget"].user=req.session.user
}
if(req.query["widget"]){
req.query ["widget].user=req.session.user
}
if(req.body["widget"]){
req.body ["widget].user=req.session.user
}
*/
}
//other stuff
next();
}
你也可以通过做这样的事情使它更通用
var model = req.options.model || req.options.controller;
if(model && sails.models[model].attributes['user']){
//do the same trick
}
如果您在 session
中存储 "user" 完整 object 调整代码并使用 req.session.user.id
编辑
抱歉,我使用自定义蓝图和查询,因为我正在使用帆 ember 蓝图 :) 但是它使事情变得更容易,您只需检查 req.params["user"]
或 req.query["user"]
如果我没记错:)
正如@MrVinz 在他的回答中所写,政策是实现这一目标的好方法。但是,不建议更改 req.body
或 req.query
,因为您可能想要访问它们的原始值。相反,您可以使用 req.options.values
为蓝图值提供默认值。例如,要将 name
值默认为登录用户的名称,您可以创建类似于以下的策略:
module.exports = function defaultNamePolicy (req, res, next) {
// Make sure req.options.values is an object, and don't overwrite
// values from prior policies
req.options.values = req.options.values || {};
// If there's a logged in user, default to using their name.
// Otherwise this will be undefined and will have no effect
req.options.values.name = req.session.user && req.session.user.name
return next();
}
req.options.values
中的值用作请求的默认值,因此如果 req.param('name')
存在,将使用它代替 req.options.values.name
。
我有一个用户模型和一个小部件模型。我在用户和小部件之间建立了关系。我还为身份验证定义了一个策略,如果用户通过了身份验证,那么我会将用户 ID 保存在 req.session 中。
小部件需要用户:
attributes: {
user: {model: 'user', required: true}
}
有什么方法可以告诉 WidgetController 使用来自身份验证策略的用户并仍然使用蓝图提供的所有默认操作?
是的 :) 您可以使用策略来实现此目的 :)
module.exports = function(req, res, next) {
if(req.session.user){
//then it depends on your implementation but
req.params["widget"].user=req.session.user
//cab be req.query["widget"] or req.body["widget"]
/*
if(req.params["widget"]){
req.params["widget"].user=req.session.user
}
if(req.query["widget"]){
req.query ["widget].user=req.session.user
}
if(req.body["widget"]){
req.body ["widget].user=req.session.user
}
*/
}
//other stuff
next();
}
你也可以通过做这样的事情使它更通用
var model = req.options.model || req.options.controller;
if(model && sails.models[model].attributes['user']){
//do the same trick
}
如果您在 session
中存储 "user" 完整 object 调整代码并使用 req.session.user.id
编辑
抱歉,我使用自定义蓝图和查询,因为我正在使用帆 ember 蓝图 :) 但是它使事情变得更容易,您只需检查 req.params["user"]
或 req.query["user"]
如果我没记错:)
正如@MrVinz 在他的回答中所写,政策是实现这一目标的好方法。但是,不建议更改 req.body
或 req.query
,因为您可能想要访问它们的原始值。相反,您可以使用 req.options.values
为蓝图值提供默认值。例如,要将 name
值默认为登录用户的名称,您可以创建类似于以下的策略:
module.exports = function defaultNamePolicy (req, res, next) {
// Make sure req.options.values is an object, and don't overwrite
// values from prior policies
req.options.values = req.options.values || {};
// If there's a logged in user, default to using their name.
// Otherwise this will be undefined and will have no effect
req.options.values.name = req.session.user && req.session.user.name
return next();
}
req.options.values
中的值用作请求的默认值,因此如果 req.param('name')
存在,将使用它代替 req.options.values.name
。