Sails.js:如何在中间件中访问和修改req.params

时间:2016-10-11 09:19:48

标签: express sails.js

我想实现一种机制来混淆应用程序中的id字段。现在所有的id字段都是整数。我想使用某种可逆散列来创建对应于id字段的随机字符串。此外,我试图通过对整个项目的最小改动来实现这一目标。

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

如果响应包含整数id,则在其上运行encode函数,将模糊的id发送给客户端。

我面临的问题是修改req对象。 idreq.bodyreq.params中可以显示res.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会更改回客户端发送的内容,并且策略中所做的更改将丢失

1 个答案:

答案 0 :(得分:0)

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

所以config / 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的编码版本,那么一个好的方法是在@ S-Stephen建议的策略中对ID进行编码,将该值存储在req中.options.id并在您的其他请求处理程序中引用它。另一方面,如果您真的只关心具有编码ID的响应,建议的做法是在处理程序中使用res.ok()响应(而不是res.send()或res。 json),并在api / respond / ok.js中调整该响应的代码,以便在发送之前对ID进行编码。如果仅对某些请求执行此操作,您还可以使用自定义响应。有关详情,请参阅自定义回复 嗨@sadlerw,您应该能够在api / respond / ok.js文件中修改res.ok()的代码,以便它始终返回JSON,如果这是您想要的每个响应。如果您只想要某些操作,则可以创建自定义响应,并在适当的时候使用。