我在node.js中写了这个简单的登录代码:
var express = require ("express");
var badyparser = require ("body-parser");
var app = express();
app.use(express.static(__dirname + "/static"));
app.use(badyparser());
var users = {
tom : "1",
jenny : "12",
mary : "123"
};
app.get("/" , function(req,resp,next){
resp.sendFile(__dirname + "/static/home.html")
});
app.post("/login" , function(req , resp , next){
// console.log(req.body); // print in terminal
// console.log(users);
for (user in users) {
if (req.body['username'] == user){
if (req.body['password'] == users[user]){
resp.json({status : "true" , msg : "YES"});
console.log("YES");
}
else {
resp.json({status : "false" , msg : "password is false"});
console.log("password is false");
}
}
else {
resp.json({status : "false" , msg : "user not found"});
console.log("user not found");
}
}
} );
app.listen(8000);
console.log("port open");
在浏览器页面显示正确答案但在终端显示此错误:
错误:发送后无法设置标头 . 在ServersResponse.header的ServerResponse.setHeader(_http_outgoing.js:501:3)的validateHeader(_http_outgoing.js:494:11)处(/Users/mohammad/Desktop/test/Login/node_modules/express/lib/response.js: 767:10)在ServerResponse.send上的ServerResponse.send(/Users/mohammad/Desktop/test/Login/node_modules/express/lib/response.js:170:12)(/ Users / mohammad / Desktop / test / Login / node_modules / express / lib / response.js:267:15)在/Users/mohammad/Desktop/test/Login/server.js:36:8在Layer.handle [as handle_request](/ Users / mohammad / Desktop / test /Login/node_modules/express/lib/router/layer.js:95:5)下一步(/Users/mohammad/Desktop/test/Login/node_modules/express/lib/router/route.js:137:13)at at在Layer.handle上的Route.dispatch(/Users/mohammad/Desktop/test/Login/node_modules/express/lib/router/route.js:112:3)[as handle_request](/ Users / mohammad / Desktop / test / Login /node_modules/express/lib/router/layer.js:95:5)
(我是节点中的新人)谢谢
2 回答
每条路线只有一个.send()或.json() . 你得到的错误是第二次调用.json .
要修复它,只需在每次通话后发出一个回报 .
app.post("/login" , function(req , resp , next){})
中的 resp 对象是http.ServerResponse https://nodejs.org/docs/latest/api/http.html#http_class_http_serverresponse的对象 .你可以使用
resp.setHeader(name, value)
设置 Headers ,直到你发送resp.writeHead(200, { 'Content-Type': 'text/plain' });
一旦调用了resp.writeHead()
,你就不能再设置任何 Headers ,除了res.end('Your content');
. 这是因为客户端将继续等待服务器的响应,直到收到响应正文或发生超时 . 收到响应正文后,您无法设置任何其他 Headers .您收到错误 Can't set headers after they are sent. at validateHeader ,因为您使用的以下代码段多次发送响应正文,这是不可接受的 .
您可以将所有对象存储在数组中并返回一次,而不是上述内容 .