AngularJS + ExpressJS。代理 POST 请求待处理
Posted
技术标签:
【中文标题】AngularJS + ExpressJS。代理 POST 请求待处理【英文标题】:AngularJS + ExpressJS. Proxy POST request is pending 【发布时间】:2014-05-06 06:01:32 【问题描述】:使用 AngularJS + Express 我有以下代码将我的请求代理到远程服务:
app.get('/api.json', function (req, res)
req.pipe(request("http://test-api.com/api.json")).pipe(res);
);
app.post('/api.json', function (req, res)
req.pipe(request.post("http://test-api.com/api.json")).pipe(res);
);
所有 GET 请求都可以正常工作,但是 POST 请求在我的浏览器中等待处理。
这是我发帖的方式:
$http(
method: 'POST',
url: '/api.json',
data: $.param(
"title": not.title,
"desc": not.description
), // pass in data as strings
headers: 'Content-Type': 'application/x-www-form-urlencoded'
).success(function () alert("Success"););
怎么了?
编辑: 这是控制台上看到的请求:
我应该检查什么以提供更多信息?
【问题讨论】:
URL 不匹配:客户端 POST 到/notifications.json
,而服务器代码处理 /api.json
只是一个错字... eidted
如果它处于挂起状态,则指向request.post
的管道不会返回任何内容或永远无法到达。如果流永远不会恢复,则响应将永远不会写入res
感谢您的回复,但是当我从客户端(通过表单)直接 POST 到 API 时,我会立即收到回复
有什么新想法吗?我迷路了:(
【参考方案1】:
您应该提到您正在使用请求库:
https://github.com/mikeal/request
request.post() 期望表单作为第二个参数:
request.post('http://service.com/upload', form:key:'value')
或作为链式调用:
request.post('http://service.com/upload').form(key:'value')
因为你没有将它作为参数传递,所以 request.form() 根本没有发出任何请求,等待你调用 .form()。但由于您也没有这样做,不会发生任何请求,因此不会返回任何响应,因此您的应用程序会看到请求失败而没有响应。您可以在 chrome 开发者工具网络选项卡中看到,请求将显示“(失败)”状态代码。
所以只需从当前请求中获取表单数据并将其传递给 request.form 就可以了。
为了将来参考,调试器会立即告诉您错误所在。我推荐 Webstorm 附带的那个,但您可以随意使用任何调试器。
编辑:没试过,但这是我会尝试的
app.post('/api.json', function (req, res)
req.pipe(request.post("http://test-api.com/api.json", form:req.body)).pipe(res);
);
【讨论】:
我想我爱你!感谢您的惊人帮助,赏金当之无愧! 我也爱你,我不是每天都能得到 500 代表赏金 ;) 我正要放弃。很高兴我找到了这个答案。需要注意的是,如果您要发布 JSON 数据,则应将form:req.body
替换为 json:req.body
@roberkules 感谢您的提示..... json:req.body 将我从一个让我发疯的问题中拯救了出来。以上是关于AngularJS + ExpressJS。代理 POST 请求待处理的主要内容,如果未能解决你的问题,请参考以下文章
AngularJS、Node.js、ExpressJS 应用程序集成问题
从 angularjs 连接到 expressjs 应用程序
ExpressJS/AngularJS:将 JSON 对象转换为字符串
ExpressJS - 为通用 Nuxt 应用程序和 AngularJS SPA 提供服务
Passport AngularJS ExpressJS:Access-Control-Allow-Origin 不允许 Origin null