CORS - OPTIONS ... 404(未找到)

Pab*_*les 7 heroku node.js cors express angular

嗨,我遇到CORS问题.

一般结构:

Angular 4将表单的数据发送到我的api.saveForm()发送有关表单联系的信息时执行功能.

app.component.ts

saveForm() {

    let headers = new Headers();
    headers.append('Content-Type', 'application/json');
    let requestOptions = new RequestOptions({ headers: headers });

    // Encode JSON as string to exchange data to web server.
    this.data = JSON.stringify(this.myContact);

    this.http.post('https://pablocordovaupdated.herokuapp.com/api', this.data, requestOptions).subscribe(res => {
            let result = res.json();
            if(result['result'] == 'success') {
                this.successMessage = true;
            }
        }
    );

}
Run Code Online (Sandbox Code Playgroud)

这是问题的根源,因为我正在使用POSTContent-Type->application/json发送我的数据,按照定义它给我一个问题CORS- preflighted request,这里有更多的定义:关于预检请求的链接

这意味着在角度4发送数据到服务器之前,这要求服务器是否可以用动词接收我的数据OPTION,如果服务器的响应是OK则则角度4发送格式的数据.

问题:

在控制台中我总是收到此错误消息:

选项https://pablocordovaupdated.herokuapp.com/api 404(未找到)

XMLHttpRequest无法加载 https://pablocordovaupdated.herokuapp.com/api.对预检请求的响应未通过访问控制检查:请求的资源上不存在"Access-Control-Allow-Origin"标头.因此,不允许来源" https://pablocordova.herokuapp.com "访问.响应具有HTTP状态代码404.

XHR加载失败:POST" https://pablocordovaupdated.herokuapp.com/api ".

错误响应{_body:ProgressEvent,status:0,ok:false,statusText:"",headers:Headers ...}

我做了什么:

到目前为止,我明白这个问题是因为https://pablocordovaupdated.herokuapp.com/api没有回复动词的答案OPTIONS

然后我尝试解决这两种方式:

使用cors包 CORS包 我根据文档配置.

var express = require('express');
var cors = require('cors');
...
var app = express();
...
app.options('/api', cors());
app.post('/api', cors(), function(req, res, next) {

    // Proccess to send this data via email
    // and also save in data base(only for learning)

});
Run Code Online (Sandbox Code Playgroud)

但我在控制台遇到同样的错误.

通过 Discussion StackOverFlow Discussion Github 手动配置标头

在我的情况下,该代码插入到我想要编写标题的每个路径中:

app.post('/api', function(req, res, next) {

    if (req.method === 'OPTIONS') {
          console.log('!OPTIONS');
          var headers = {};
          // IE8 does not allow domains to be specified, just the *
          // headers["Access-Control-Allow-Origin"] = req.headers.origin;
          headers["Access-Control-Allow-Origin"] = "*";
          headers["Access-Control-Allow-Methods"] = "POST, GET, PUT, DELETE, OPTIONS";
          headers["Access-Control-Allow-Credentials"] = false;
          headers["Access-Control-Max-Age"] = '86400'; // 24 hours
          headers["Access-Control-Allow-Headers"] = "X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept";
          res.writeHead(200, headers);
          res.end();
    } else {
        // Process to send this data via email
        // and also save in data base(only for learning)
    } 

});
Run Code Online (Sandbox Code Playgroud)

这里的问题是从不执行 console.log('!OPTIONS');

这里我也尝试过:

app.post('/api', function(req, res, next) {
    console.log('!I AM YOUR FATHER');
    ...
});
Run Code Online (Sandbox Code Playgroud)

但从未打印过.注意:我试图看到此消息,heroku logs因为整个页面都在Heroku中.

但是这样做我得到了同样的错误.

更多信息:

.../api调用时,我有这个标题

**GENERAL**:

Request URL:https://pablocordovaupdated.herokuapp.com/api
Request Method:OPTIONS
Status Code:404 Not Found
Remote Address:23.21.185.158:443
Referrer Policy:no-referrer-when-downgrade

**RESPONSE HEADERS**:

HTTP/1.1 404 Not Found
Connection: keep-alive
Server: Cowboy
Date: Wed, 10 May 2017 04:14:45 GMT
Content-Length: 494
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache, no-store

**REQUEST HEADERS**:

OPTIONS /api HTTP/1.1
Host: pablocordovaupdated.herokuapp.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: POST
Origin: https://pablocordova.herokuapp.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36
Access-Control-Request-Headers: content-type
Accept: */*
Referer: https://pablocordova.herokuapp.com/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: es-ES,es;q=0.8
Run Code Online (Sandbox Code Playgroud)

题:

这是我的真正问题还是我理解不好?和/或 我该怎么做才能解决这个问题?和/或 任何建议?

谢谢.

sid*_*ker 5

问题似乎是: https: //pablocordovaupdated.herokuapp.com/api 总是返回 404:

\n
$ curl -i https://pablocordovaupdated.herokuapp.com/api\nHTTP/1.1 404 Not Found\n
Run Code Online (Sandbox Code Playgroud)\n

也就是说,服务器\xe2\x80\x99没有为OPTIONS\xe2\x80\x94执行任何特殊/不同的操作,而是所有请求都只是命中该404。

\n
\n
app.post(\'/api\', function(req, res, next) {\n    console.log(\'!I AM YOUR FATHER\');\n    ...\n});\n
Run Code Online (Sandbox Code Playgroud)\n
\n

我\xe2\x80\x99m 不太清楚 Express 如何处理这种情况,但可能必须将其配置为为该路由 \xe2\x80\x94 发送某种响应,而不仅仅是console.log在服务器端。

\n

当我查看https://pablocordovaupdated.herokuapp.com/api的内容时,我看到的只是一个通用的 Heroku 404 页面 \xe2\x80\x94 所以它 \xe2\x80\x99s 不是从你的应用程序提供的,而是回到由 Heroku 提供服务。例如,404页面的内容是这样的:

\n
<iframe src="//www.herokucdn.com/error-pages/no-such-app.html"></iframe>\n
Run Code Online (Sandbox Code Playgroud)\n

也就是说,在任何情况下,您的应用程序代码似乎都不会按预期处理对该 URL 的请求。所以看起来 \xe2\x80\x99 是你需要首先修复的。

\n