[expressjs/express]功能请求:能够根据响应设置设置

2024-07-04 287 views
5

我想实现一个中间件,当pretty_ouput查询中存在时,它会在响应中返回格式化的 json。我尝试使用以下代码:

  // This code does not work as expected.
  app.use(function(req, res, next) {
    // Querystring `pretty_output` should prettify json output.
    if (req.query['pretty_ouput']) {
      app.set('json spaces', 2); // I'd like to set this only for this one request.
    }
    next();
  });

但是,没有查询字符串的后续请求pretty_ouput也会被格式化。

json spaces有没有办法只为一个请求设置设置?理想情况下,我可以调用res.set('json spaces', 2)只为这一个响应设置此选项。我认为这对任何 Express 选项都很有用。

回答

8

@bradvogel 如果在请求不包含查询字符串时禁用该设置会怎样?

if (req.query['pretty_output']) {
    app.set('json spaces', 2);
} else {
    app.disable('json spaces'); // or app.set('json spaces', false)
}
6

你可以做一些简单的事情,例如:

function sendPrettyJson (req, res, value) {
  this.set('Content-Type', 'application/json')
  var body = req.query['pretty_output'] ? JSON.stringify(value, null, 2) : JSON.stringify(value)
  res.send(body)
}  
1

是的 - 谢谢。我知道我可以接管 res.json 并自行格式化 - 但我更愿意继续使用内置功能res.json并从其未来的改进中受益。

是否仍然需要在响应级别设置选项,例如暂时禁用x-powered-by单个响应之类的功能?或者将来会添加任何选项?

7

对此有普遍的需求,我相信对此有一些未解决的问题。我现在正在工作,所以无法挖掘它们,但如果你搜索问题和 pr,你可能会找到它们。我不记得是否有人创建了足够强大的提案以将其标记为纳入5.x,但请随意这样做 :)

7

@wesleytodd 我也以为之前讨论过这个问题,但我找不到。我认为这很有用,但即使只看现在的使用方式,它也可能与 Express 4.x 不兼容,因为有几个地方的设置是查找时没有任何参考reqres关闭的。

5

同样,我也找不到。我认为我们应该将其添加到5.x路线图中。它应该足够简单,可以到达req那些res地方,而且在我看来,增加的价值是值得的。

6

嗨,我调查了一些涉及竞争的未解决问题(作为一个研究项目),并查看了 @graphicbeacon 的解决方案。我创建了一个小型应用程序(https://github.com/sanji-programmer/express-issue-3536-race),正如 @wesleytodd 正确指出的那样,该解决方案受到竞争的影响(https://github.com/sanji-programmer/express-issue-3536-race/blob/master/express01/server-test.js)。使用我们开发的工具,我可以探索揭示竞争的不同回调交错。

我还验证了@wesleytodd( https://github.com/sanji-programmer/express-issue-3536-race/blob/master/express01/server-test-fixed.js )提出的解决方案,这似乎没问题,并且不会受到竞争影响。

我还注意到,修改 express 的全局设置也可能会在不同场景中引起竞争。