2016-10-11 80 views
0

我想实现一种机制来混淆我的应用程序中的id字段。现在所有的id字段都是整数。我想使用某种可逆哈希来创建对应于id字段的随机字符串。另外,我正试图通过对整个项目进行微小的更改来完成此任务。Sails.js:如何访问和修改中间件中的req.params

我想到的一件事是编写一个中间件来拦截每个请求和响应对象,并检查是否存在id字段。如果请求包含id字段并且它是混淆版本,请解码该字符串并将该请求参数替换为整数ID。

如果响应中包含整数id,请对其执行编码功能,将混淆的id发送给客户端。

我面临的问题是修改req对象。 id字段可以存在于req.bodyreq.paramsres.query中。但是,在中间件中,当它出现在req.params中时,我无法看到ID字段。

我试过使用策略。但是我面临的问题是,即使在更改req.params后,控制权到达控制器时,更改也会丢失。什么是解决这个问题的建议方法?

下面是示例代码:

在政策:

module.exports = function (req, res, next) { 
    req.params.id = '12345'; 
    req.query.pageSize = 30; 
    req.body = {}; 

    sails.log.info('req.params', req.params); 
    sails.log.info('req.query', req.query); 
    sails.log.info('req.body', req.body); 
    return next(); 
}; 

我只是修改的req.params,req.query和req.body值。

当我尝试访问控制器中的这些值时,req.query和req.body的值是在策略中更改的修改值。但是,req.params变回客户端发送的内容,并且策略中所做的更改丢失了

+0

一些代码,请问? – SkyQ

+0

@SkyQ:增加了一些示例代码。我现在做的不多。只是改变req.params,req.query和req.body –

回答

0

我认为您混淆了策略和中间件?你的代码是否在api/policies中?如果是这样,您仍然需要在config/policies中定义此策略应用于哪个控制器。

所以配置/ policies.js应该是这样的:

modue.exports.policies = { 
    // If you really want this policy for every controller and action 
    '*': 'policyName.js', 

    // If you want it for a specific controller. '*' denotes every action in controller 
    specificController: { 
     '*': 'policyName.js' 
    }, 

    // If you want it for a specific action on a specific controller 
    specificController: { 
     'specificAction': 'policyName.js' 
    } 

}; 

另外,我想补充。策略通常用于授权控制器,但这似乎是一个体面的用例。由于每个请求都不会有这些字段,所以这应该是一个策略。在少数控制器/操作中应用某些策略时,策略非常棒。当您需要应用到应用程序的每一个动作时,中间件都非常棒。

http://sailsjs.org/documentation/concepts/policies

http://sailsjs.org/documentation/concepts/middleware

响应的Gitter: sgress454 @ sgress454 10:45 @ mandeepm91

在政策,如果我改变req.body或req.query,变化坚持下一个政策或控制者。但是,对req.params所做的更改会丢失。 这是req.options的主要用例之一。此对象旨在用于存储请求数据,在传递到下一个处理程序之前,可以由一个处理程序进行变异。 req.params对象旨在为每个处理程序提供原始请求参数的副本。 你如何解决这个问题真的取决于你的目标是什么。如果您确实需要每个请求处理程序(即策略和控制器操作)来查看ID的编码版本,那么一种好的方法是将ID作为@ S-Stephen建议的方式编码,并将该值存储在req中.options.id并在你的其他请求处理程序中引用它。另一方面,如果您真的只关注具有编码ID的响应,则建议的做法是在您的处理程序中使用res.ok()响应(而不是res.send()或res.json)并在api/responses/ok.js中调整该响应的代码以在发送之前对ID进行编码。如果这仅适用于某些请求,您也可以使用自定义响应。查看自定义响应获取更多信息。 嗨@sadlerw,你应该能够修改你的api/responses/ok.js文件中res.ok()的代码,让它总是返回JSON,如果这是你想要的每一个响应。如果您只想要执行某些操作,则可以创建自定义响应,并在适当的地方使用该响应。

+0

的值我不会混淆策略和中间件。我尝试了两个。在中间件中,我无法弄清楚如何访问req.params,因为它是未定义的。在政策中,我能够访问它,但一旦控制器操作执行,修改就会丢失。我在policies.js中做了必要的更改,将策略附加到控制器操作 –

+0

我看到您对gitter有了很好的解释!我将用gitter响应更新我的原始答案,以帮助未来出现同样问题的人。 – ktravelet

相关问题