Express.js 带有 jsonp 负载的响应状态代码

Express.js response status code with jsonp payload

我有一个 MEAN 堆栈后端,我想在其中响应

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'
});

知道我忽略了什么吗?

看起来这是浏览器的事情:当请求远程脚本时(就像 JSONP 请求的情况),响应 returns 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 状态会。如果处理程序 returns 纯 JS(就像一个简单的 .js 文件加载了 <script src=...>),它也不起作用。

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