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