使用 Express.js 返回带有 JSONP 数据的响应状态码

6

我有一个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'
});

我有什么遗漏的想法吗?


你配置了Express默认的JSONP回调函数为JSON_CALLBACK吗? - Nivesh
1
@Nivesh 如有误请指正,但如果不是这种情况,res.jsonp({code: '234'})res.status(300).jsonp({code: '234'}) 也不会生效,对吗? - Tom
1
@Nivesh 如果回调设置不正确,即使是200/300响应也会失败... - robertklep
我在我的应用程序中一直使用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正在按照预期工作,只是无法获取HTTP代码为2 ** / 3 **以外的有效负载。 - Tom
1个回答

2
似乎这是一个浏览器问题:当请求远程脚本时(如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(就像使用<script src=...>加载的简单.js文件一样),它也无法工作。

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


真的吗,我也要查一下这个。 - Nivesh
1
感谢Robert确认了我已经发现的问题:它不起作用! :) 看起来很奇怪,根据文档应该可以工作:http://expressjs.com/en/api.html#res.jsonp。当使用`res.jsonp(400, {})时,我在日志中看到这个传递:express deprecated res.jsonp(status, obj): Use res.status(status).jsonp(obj) instead`。 - Tom
@Tom 嗯,文档建议这样做很奇怪。我想知道他们是否真正进行了测试 :P - robertklep
是的,浏览器不允许评估随400状态一起传输的响应数据。 - Nivesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接