【发布时间】:2017-08-19 17:16:21
【问题描述】:
我有一个用户填写的联系表格,该表格将发布到我的 Web API 以使用nodemailer 发送。
当我在本地运行客户端和 API 时,CORS 可以正常工作:
客户
本地主机:4200 使用 POST 请求
sendEmail(queryObject: any) {
const body = JSON.stringify(queryObject);
const headers = new Headers();
headers.append('Content-Type', 'application/json');
return this.http.post('http://localhost:3000/api/sendemail', body, {headers: headers})
.map((response: Response) => response.json());
}
API
本地主机:3000
但一旦我将我的 API 部署到 heroku 并将客户端中的 POST URL 更改为指向 Heroku,我就会收到预检错误:
选项https://keilcarpenter-portfolioapi.herokuapp.com/api/sendemail 503(服务不可用)
XMLHttpRequest 无法加载 https://keilcarpenter-portfolioapi.herokuapp.com/api/sendemail。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问 Origin 'http://localhost:4200'。响应的 HTTP 状态代码为 503。
我确定我在我的 API 上的 server.js 中正确设置了 CORS:
app.use(function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
为什么 CORS 在本地接受 POST 而不是在 Heroku 上?
【问题讨论】:
-
另请注意,字符串化为 json 并添加 json 内容类型标头是不必要的。只需发布对象,Angular 就会为您完成。
标签: angular http-status-code-503