【问题标题】:Nodejs server with Express not sending responses to HTTP requests from javascript file, but is receiving the requests and processing them带有 Express 的 Nodejs 服务器不发送对来自 javascript 文件的 HTTP 请求的响应,但正在接收请求并处理它们
【发布时间】:2018-04-29 13:48:39
【问题描述】:

所以我在同一台机器上有一个 node-js 服务器和一个 apache 服务器,其中一个 javascript 文件正在向 node-js 服务器发送一个 HTTP 请求。 node-js 服务器接收文件,读取数据,按原样将其放入数据库,但它没有发回任何状态代码或数据。

这里是 XHTMLRequest 发送代码 sn -p,

// creates a new http request to be sent to the nodejs server
function createNewUser(username, password, email) {

    // The url is the URL of our local nodejs server
    var userCreateRequest = new XMLHttpRequest();
    userCreateRequest.open( "POST", "http://<machine's IP>:8080/api/users" );

    // Create json object for user data
    var user = "name="+username+"&password="+password+"&email="+email;
    alert(user);

    // set content type for http request
    userCreateRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    // Event listern for server response
    // userCreateRequest.addEventListener("readystatechange", processRequest, false);

    // Call process request whenever state changes
    userCreateRequest.onreadystatechange = function() {
            alert(this.readyState + ", " + this.status);
            if (this.readyState == 4 && this.status == 200) {

                    var response = this.response;
                    alert(response.name);

            }

    }

    // Send user data to server
    userCreateRequest.send(user);

}

这是 node-js 服务器的代码(使用 express)

router.route('/users')

    .post(function(req, res) { //create a new user

            var user = new User();

            user.name = req.body.name;
            user.password = req.body.password;
            user.email = req.body.email;

            user.save(function(err) { //add user object to database

                    if(err)
                            res.send(err);

                    res.status(200).json(user);

            });

    });

正如我上面所说,代码在将请求主体放入数据库等方面工作正常,但服务器没有发回 200 OK 响应(或者我没有收到它某些原因)。我从 onreadystatechange 收到警报的唯一时间是状态 2、状态 0 和状态 4、状态 0。

【问题讨论】:

  • http://&lt;machine's IP&gt;:8080 是跨域请求吗?查找 CORS - express 有一个 cors 模块,所以很容易
  • 恐怕不是,因为我提到两台服务器都托管在同一台机器上。但由于某种原因,localhost:8080/api/users 不起作用,而指定机器的外部 IP 则...
  • 同一台机器...同一端口? (8080) 如果是,为什么您的请求使用 FQDN?
  • 是的,如果它是跨源请求并且没有 cors 标头启用请求,则这是一个 cors 问题
  • 单独说明。你应该返回res.send(err);,否则你会因为尝试发回两次回复而出错。

标签: javascript node.js express xmlhttprequest


【解决方案1】:

试试下面的代码 sn-p。

user.save(function(err, user) {

                if(err)
                        res.send(err);

                res.status(200).json(user);

        });

【讨论】:

    【解决方案2】:

    这确实是一个 CORS 问题。我仍然有点不确定究竟是为什么,但是在配置 express/CORS 包以允许来自我的 apache 服务器的 IP 和端口的请求之后,它开始工作了。

    我的理解是,跨域意味着不同的域,因为我的两台服务器(据我所知)位于同一域的不同端口上。

    无论哪种方式,启用 CORS 都可以解决问题。感谢 Jaromanda X 指出并让我走上正轨。

    【讨论】:

    • 同一个域上的不同端口仍然算作跨域:“Web 应用程序在请求具有不同来源(域、协议或端口)的资源时执行跨域 HTTP 请求来自它自己。”来自MDN
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 2013-09-29
    相关资源
    最近更新 更多