【发布时间】:2017-07-31 19:56:32
【问题描述】:
我在向我的 Node.js 服务器发送 POST 请求时遇到了一个奇怪的问题。我也有一些 GET 听众,但他们工作得很好。因此,我尝试从 Angular 2 应用程序(端口 4200)向 Node.js 服务器(端口 443)发送一个简单请求,如下所示,但我收到一个错误:
XMLHttpRequest 无法加载 http://localhost:443/edit_comment。回复 预检请求未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:4200” 访问。
客户服务方法:
public saveComment(id: number, comment: string) : Observable<Response> {
let data = { id: id, comment: comment };
let headers = new Headers({'Content-Type': 'application/json'});
let options = new RequestOptions({ headers: headers });
return this.http.post('http://localhost:443/edit_comment', JSON.stringify(data), options)
.map((res:Response) => res.json())
.catch((error:any) => Observable.throw(error.json().error || 'Server error'));
}
和 node.js 服务器 端(带有 express 库):
app.post('/edit_comment', (req, resp) => {
console.log('blabla') //this log never displays
resp.setHeader('Access-Control-Allow-Origin','*')
resp.send(JSON.stringify('foo'))
});
问题是 app.post 回调函数似乎没有被调用,因为 console.log 没有在屏幕上显示“blabla”消息。
在这里,我的浏览器中还有来自开发者工具的请求和响应标头:
请求标头:
Accept:*
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Cache-Control:no-cache
Connection:keep-alive
Host:localhost:443
Origin:http://localhost:4200
Pragma:no-cache
Referer:http://localhost:4200/testlinemonitor
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
响应标头:
HTTP/1.1 200 OK
X-Powered-By: Express
Allow: POST
Content-Type: text/html; charset=utf-8
Content-Length: 4
ETag: W/"4-oCQ57CKdi+DnSwwWAjkjEA"
Date: Fri, 10 Mar 2017 12:49:41 GMT
Connection: keep-alive
问候
【问题讨论】:
-
预检请求选项 /edit_comment 应配置为发送正确的标头,就像在调用 POST /edit_comment 之前浏览器将调用 OPTIONS /edit_comment
标签: javascript angularjs node.js http post