首页 文章

错误:在node.js中发送标头后无法设置标头

提问于
浏览
-1

我在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 回答

  • 0

    每条路线只有一个.send()或.json() . 你得到的错误是第二次调用.json .

    要修复它,只需在每次通话后发出一个回报 .

  • 0

    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 ,因为您使用的以下代码段多次发送响应正文,这是不可接受的 .

    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");
        }
      }
    

    您可以将所有对象存储在数组中并返回一次,而不是上述内容 .

    var returnableObject = [];
    
     for (user in users) {
    
        if (req.body['username'] == user){
          if (req.body['password'] == users[user]){
            returnableObject.push({status : "true" , msg : "YES"});
            console.log("YES");
          }
          else {
            returnableObject.push({status : "false" , msg : "password is false"});
            console.log("password is false");
          }
        }
        else {
          returnableObject.push({status : "false" , msg : "user not found"});
          console.log("user not found");
        }
    
      }
    
      resp.json(returnableObject);
    

相关问题