Angularjs 尝试POST请求时出现CORS问题
我正试图从运行在4200端口上的angularJS应用程序向运行在不同端口3000上的nodeJS应用程序发送post请求,如下所示 AngularJS 2.0代码:Angularjs 尝试POST请求时出现CORS问题,angularjs,node.js,cors,http-post,Angularjs,Node.js,Cors,Http Post,我正试图从运行在4200端口上的angularJS应用程序向运行在不同端口3000上的nodeJS应用程序发送post请求,如下所示 AngularJS 2.0代码: addNewItem(body:string) { const headers = new Headers(); headers.append('Content-Type','application/json'); return this.http.post('http://10.244.1.59:3000
addNewItem(body:string) {
const headers = new Headers();
headers.append('Content-Type','application/json');
return this.http.post('http://10.244.1.59:3000/newBinDevice',body,{
headers: headers
})
.map((response : Response) => response.json());
}
NodeJS代码
var express = require('express');
module.exports = function(app){
var db = require('./dbclient');
var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true}));
db.dbconnection(null,null,null,null,'smartbin',null);
app.post('/newItem', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
//res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header("Access-Control-Allow-Headers", "Content-Type");
res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
console.log('body request is ' + req.body + " after stringifying it " + JSON.stringify(req.body) + " array to string " + req.body.toString());
}
我收到的CORS问题是,对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许来源”标头。起源'http://localhost:4200因此,不允许访问。响应的HTTP状态代码为404。我在某个地方读到,一个人只能发送数据
application/x-www-form-urlencoded
multipart/form-data
text/plain
当我试图从AngularJS应用程序以字符串而不是JSON对象的形式发送数据时,我在nodejs应用程序上得到的是空数据。您需要向express应用程序添加更多中间件来支持 您可以使用以下软件包: 这将启用包的默认CORS配置。配置选项在中有详细概述
您问题中的代码的问题是,您在POST响应中包含了CORS头,但它们需要在飞行前选项响应中返回。与其编写自己的CORS实现,不如建议使用上面提到的包。我是stackoverflow的新手,但不久之前就遇到了这个问题: 在应用程序中使用此代码
var cors = require('cors');
app.use(cors({
'allowedHeaders': ['sessionId', 'Content-Type'],
'exposedHeaders': ['sessionId'],
'origin': '*',
'methods': 'GET,HEAD,PUT,PATCH,POST,DELETE',
'preflightContinue': false
}));
并确保在浏览器中禁用CORS扩展名(如果有)。更新了答案。我对上述代码做了如下小改动。var cors=要求“cors”;var copions={origin:*,方法:GET、HEAD、PUT、POST、OPTIONS、preflightContinue:true};app.post'/newBinDevice',corscoptions,functionreq,res,next{console.logJSON.stringifyreq.body;}尽管服务器正在获取post请求,post参数值仍作为空json对象接收。无法找出此处的问题所在。请不要使用Preflight Continue。浏览器将发送两个请求:第一个使用选项方法;第二种是使用POST方法。选项请求是飞行前请求;你不想在邮寄路线上处理这个问题。让cors模块处理选项请求/响应。你看不到正文,因为它没有在选项请求中传递。我完全删除了Preflight Continue,并测试了将其设置为false。在这两种情况下,我仍然接收空的JSON对象。当我在浏览器上查看请求负载时,我能够在请求负载中看到JSON对象。但在服务器端,我收到的是空对象。如果请求到达您的post路由,则CORS问题得到解决。无论尸体是否如你所期望的那样到达,都与CORS无关。对于CORS,请求是允许的还是不允许的。您的CORS问题已经解决,我认为,与其更新/扩展您的问题以解决您的身体问题,不如提出一个新的、与身体相关的问题。
var cors = require('cors');
app.use(cors({
'allowedHeaders': ['sessionId', 'Content-Type'],
'exposedHeaders': ['sessionId'],
'origin': '*',
'methods': 'GET,HEAD,PUT,PATCH,POST,DELETE',
'preflightContinue': false
}));