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

标签 angularjs node.js express mean-stack

我有一个 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 请求的情况),并且响应返回 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 文件,加载了 <script src=...> ),它也不起作用。

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

关于angularjs - 带有 jsonp 负载的 Express.js 响应状态代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37592009/

相关文章:

express - 带有 express-handlebars 的 webpack

javascript - 如何使用 Express.js 为单页应用程序正确设置路由?

javascript - IOAuth.IO 与 Ionic/Angular 混合应用程序的集成

javascript - 将数据从父窗口传递到子窗口

javascript - IOS 设备中的浏览器不会在后台自动播放声音

mysql - Strongloop mysql 连接器 ER_NO_DB_ERROR : No database selected

node.js - 如何实现对数据库的异步调用

angularjs - 为什么我从ng-show =“!emptyArray”和ng-hide =“emptyArray”得到不同的结果?

java - 尝试使用 CORS 时出现 403(禁止访问)

node.js - Node Express app.get ("/.."父目录不起作用