在我的angularJS服务中,我正在调用http
模块向NodeJS编写的API发出POST请求。 POST请求自动更改为OPTIONS,并在浏览器中出现交叉原因错误,但我已在节点中包含标题以允许所有来源。
点击按钮时POST请求正确触发,代码如下:
addNewBooking(newBooking){
var headers = new Headers();
return this.http.post('http://localhost:3000/bookings', newBooking,
{headers: headers})
.map(res => res.json());
}
在节点控制台中,我看到请求是生成的
选项
> OPTIONS /bookings 200 6.792 ms - 24
我正在使用 -
侦听节点服务器中的请求router.post('/', function(req, res, next) {
console.log("api called");
res.send(200);
});
在我的主app.js
中,我设置快速属性,以允许交叉原点:
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:false}));
/// catch 404 and forward to error handler
app.use(function(req, res) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
我认为通过包含错误将解决的跨源头文件。
发出请求时,浏览器中出现的错误如下所示:
XMLHttpRequest cannot load http://localhost:3000/bookings. Response to preflight request doesn't pass access control check:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:4200' is therefore not allowed access.
我不确定为什么请求默认为OPTIONS。我在其他AngularJS应用程序中遵循了相同的约定,并没有看到这种问题。我能够使用router.options('/')
捕获请求但是我仍然在浏览器中收到错误,并且不是我正在寻找的请求类型。