【问题标题】:Express.js response status code with jsonp payload带有 jsonp 有效负载的 Express.js 响应状态代码
【发布时间】:2016-10-02 04:47:34
【问题描述】:

我有一个 MEAN-stack 后端,我想用

来响应
return res.status(400).jsonp({
  message: 'Parsing failed.',
  code: '123'
});

当 Angular 应用程序使用此 JSONP 端点并遇到此特定错误时,它会收到 400 但没有其有效负载。当我将状态更改为 200/300 时,它会正常运行,而 400/500 则不会。

在其他路由 (POST) 上,我可以毫无问题地使用 4** 状态代码和有效负载进行响应。

return res.status(400).send({
  message: 'Codes do not match.',
  code: '234'
});

知道我忽略了什么吗?

【问题讨论】:

  • 您是否将 Express 默认 JSONP 回调配置为 JSON_CALLBACK ?
  • @Nivesh 纠正我的理解,但如果不是这样,res.jsonp({code: '234'})res.status(300).jsonp({code: '234'}) 也不起作用,对吗?
  • @Nivesh 如果回调设置不正确,200/300 响应也会失败...
  • 我在整个应用程序中都使用 JSONP,所以我很确定它可以正常工作,只是没有 400/500 状态代码。我的 Angular 应用程序像这样请求它return $http.jsonp('/api/code?callback=JSON_CALLBACK').then( MEAN-stack(上面的代码)响应/**/ typeof angular.callbacks._6 === 'function' && angular.callbacks._6({"code":"234"}); 正如我所说,JSONP 正在正常工作,只是不要使用 2**/3 以外的 HTTP 代码获取有效负载**

标签: angularjs node.js express mean-stack


【解决方案1】:

看起来这是一个浏览器问题:当请求远程脚本时(如 JSONP 请求的情况),并且响应返回 400(或更高)HTTP 状态,任何可能仍会返回的代码响应正文没有被评估(这实际上很有意义)。

Angular 只会知道响应已发送,并且它处于错误状态,但由于未调用回调,因此没有有效负载数据可传递给您的回调。

我测试了一个独立的 HTML 页面:

<script>
function foo(data) { alert('foo') }
</script>
<script src="/endpoint?callback=foo"></script>

以及以下 Express 处理程序:

app.get('/endpoint', (req, res) => {
  return res.status(400).jsonp({ hello : 'world' });
});

400 状态不会触发警报,200 状态会。如果处理程序返回纯 JS(就像一个简单的 .js 文件,加载了 &lt;script src=...&gt;),它也不起作用。

因此,对于 JSONP 请求,您应该坚持使用 200 个响应并以其他方式传达任何错误(例如在响应对象中设置 error 属性)。

【讨论】:

  • 真的,让我也看看这个。
  • 感谢罗伯特,对我已经想通的内容的确认:这行不通! :) 看起来很奇怪,应该根据文档工作:expressjs.com/en/api.html#res.jsonp。当使用res.jsonp(400, {}) 时,我在日志中看到了这一点:express deprecated res.jsonp(status, obj): Use res.status(status).jsonp(obj) instead
  • @Tom 嗯,是的,奇怪的是文档提出了这个建议。我想知道他们是否真的测试过:P
  • 是的,浏览器不允许评估伴随 400 状态而来的响应数据。
猜你喜欢
  • 1970-01-01
  • 2018-07-19
  • 2018-03-14
  • 1970-01-01
  • 2016-01-18
  • 2017-09-26
  • 2016-04-14
  • 2017-10-22
  • 1970-01-01
相关资源
最近更新 更多