簡體   English   中英

node.js / express應用程序中的錯誤:發送標頭后無法設置標頭

[英]Error in node.js/express app: Can't set headers after they are sent

我在通過Express設置Node.js應用程序以進行路由而在數據庫中使用MongoDB(Mongolab)時遇到了問題。 我一直在環顧四周,發現許多其他用戶都遇到相同的問題,但仍未找到解決問題的方法。希望有人能提供幫助。

我一直收到的Error: Can't set headers after they are sent.Error: Can't set headers after they are sent.

POST /login請求后出現錯誤。 我試圖使用res.end(); res.redirect('/users/index'); 並返回渲染。.但是還沒有成功..

這里最重要的代碼:

Server.js

  /* LOAD ALL DEPENDENCIES
    ----------------------------------------- */
    const express = require('express');
    const path = require('path');
    const request = require('request');
    const session = require('express-session');
    const compression = require('compression');
    const bodyParser = require('body-parser');
    const app = express();

    /* MONGODB CONFIGURATION
    ----------------------------------------- */
    const MongoClient = require("mongodb").MongoClient;
    require('dotenv').config();
    const dbConfig = process.env.MONGODB_URI;

    MongoClient.connect(dbConfig, (err, database) => {
      if (err) return console.log(err)
      db = database
    });

    /* SESSIONS CONFIGURATION
    ----------------------------------------- */
    app.use(session({
        secret: "JA1d82JHYF9?nsdfDF635MuHe#ksd",
        resave: false,
        saveUninitialized: true
    }));

    /* SET PORT FOR HEROKU
    ----------------------------------------- */
    const port = process.env.PORT || 3000;
    const host = process.env.HOST ||'0.0.0.0';

    // Rest of the code ..

    app.use('/users', usersRouter);
    // Router is loaded earlier

    /* START THE NPM SERVER
    ----------------------------------------- */
    app.listen(port, host, function() {
        console.log(`Server started on port ${port}`);
    });

users.js(路由)

/* LOAD ALL DEPENDENCIES
----------------------------------------- */
const express = require('express');
const router = express.Router();
const passwordHash = require('password-hash');

/* INDEX ROUTE
----------------------------------------- */
router.get('/', function(req, res) {
  if (req.session.login) {
    res.render('users/index');
  } else {
    res.redirect('/users/login');
  }
});

router.get('/login', function(req, res) {
  res.render('users/login');
});

router.post('/login', function(req, res) {
  const loginName = req.body.username;
  const loginPassword = req.body.password;
  db.collection('users').find().toArray(function(err, results) {
    results.map(function(user) {
      if (user['username'] === loginName) {
        const pwCheck = passwordHash.verify(loginPassword, user['password']);
        if(pwCheck === true) {
          req.session.login = true;
          req.session.username = user['username'];
          res.render('users/index');
        } else {
          res.redirect('/users/')
        }
      }
    })
  });
});

完全錯誤

Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11)
    at ServerResponse.header (/Users/camillesebastien/Documents/Programming/Mongo App/node_modules/express/lib/response.js:725:10)
    at ServerResponse.send (/Users/camillesebastien/Documents/Programming/Mongo App/node_modules/express/lib/response.js:170:12)
    at done (/Users/camillesebastien/Documents/Programming/Mongo App/node_modules/express/lib/response.js:962:10)
    at tryHandleCache (/Users/camillesebastien/Documents/Programming/Mongo App/node_modules/ejs/lib/ejs.js:208:10)
    at View.exports.renderFile [as engine] (/Users/camillesebastien/Documents/Programming/Mongo App/node_modules/ejs/lib/ejs.js:412:10)
    at View.render (/Users/camillesebastien/Documents/Programming/Mongo App/node_modules/express/lib/view.js:128:8)
    at tryRender (/Users/camillesebastien/Documents/Programming/Mongo App/node_modules/express/lib/application.js:640:10)
    at EventEmitter.render (/Users/camillesebastien/Documents/Programming/Mongo App/node_modules/express/lib/application.js:592:3)
    at ServerResponse.render (/Users/camillesebastien/Documents/Programming/Mongo App/node_modules/express/lib/response.js:966:7)

我的問題

該錯誤的確切含義是什么,出了什么問題? 在這種情況下,我該如何解決?

我在Node.JS中構建,其中Express作為路由器,而mongoDB作為數據庫。 可能與這有關嗎?

我在Stackoverflow上檢查了很多類似的問題,但是還不能解決我的問題。

希望有人能幫助我,在此先感謝!

剛想到:

問題可能是我在localhost上測試,而mongodb(mongolab)在Heroku上設置了嗎?

您的問題是,對於數據庫查詢返回的每個與密碼和用戶名匹配的結果值,您都在調用res.render() 每個請求只能調用res.render() 因此,從理論上講,如果僅返回1個用戶並且其密碼匹配,這將起作用,但是如果同一用戶多次存在並且具有相同的密碼,則在發送一次之后將調用res.render()

我的建議是遍歷返回的用戶列表,然后在首次匹配后細分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM