2016-04-20 95 views
3

我正在编写一个Express应用程序,我在使用AirBnB eslint configuration。该lint配置提供了一个no-params-reassign检查,该检查标记重新分配参数和这些参数的成员为错误。我个人喜欢这个,但我不确定是否有方法修改Express中的reqres而不改变功能参数。修改res而不会改变参数

例如,我想重写在中间件请求的一部分:

app.use((req, res, next) => { 
    req.url = req.url.replace("regex", "replacement"); 
}); 

这引发棉绒错误。我知道我可以通过这样做使错误消失:

app.use((_req, res, next) => { 
    req = _req; 
    req.url = req.url.replace("regex", "replacement"); 
}); 

...但这似乎是一个有点愚蠢的解决方案。是否有替代Express中的未来中间件调用的reqres变量的方法,还是保持更改以实际变异它们的唯一方法?

我知道我可以重写no-params-reassign规则,但我想看看是否可以在不这样做的情况下实现此目的。谢谢!

+2

简答题?是的,一般的规则是当你的中间件走过时需要修改'req'和'res'。官方指南甚至建议[这样做](http://expressjs.com/en/guide/writing-middleware.html)。可能有一种解决方法,但我从来没有见过。 req.replacedUrl = req.url.replace(“regex”,“replacement”);'发出'eslint'警告? – dvlsg

+1

是的 - 教条是不改变参数。 Guess Express可能与此不兼容? –

+1

我当然可能会误会,但它似乎是推荐使用Express的方式。和大多数nodejs http /服务器库,真相被告知。我认为这个想法是,中间件通常用于“扩展”你需要的部分请求/响应对象。无论好坏。 – dvlsg

回答

0

是否有快速更换REQ和RES变量未来中间件调用的方法:

使用app对象持久性存储器中的第一次调用,然后检查它的后续调用

app.use((req, res, next) => { 
    app.req = app.req || req; 
    app.req.url = app.req.url.replace("regex", "replacement"); 
}); 

JSON.stringifyJSON.parse可以用来避免突变:

app.use((req, res, next) => { 
    app.req = app.req || JSON.parse(JSON.stringify(req)); 
    app.req.url = app.req.url.replace("regex", "replacement"); 
}); 

参考