2017-03-31 59 views
0

我在使用Express为路由和MongoDB(Mongolab)为数据库设置Node.js应用程序时遇到问题。我一直在寻找&发现了很多其他用户有同样的问题,但无法找到问题的解决方案呢..希望有人可以提供帮助。node.js/express app中的错误:发送后无法设置标题

我不断收到的错误是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(route)

/* 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) 

我的问题

这个错误是什么意思究竟是什么问题呢?我怎么能在这种情况下解决这个问题?

我使用Express作为路由器和mongoDB作为数据库在Node.JS中构建。难道这与它有关吗?

我提前查了很多类似的问题,#2,但没能解决我的问题还没有..

希望有人能帮助我,谢谢!

就想出了一个念头:

可能的问题是我测试在本地主机上,而MongoDB的(mongolab)被设置在Heroku?

+1

这将有助于了解何时出现此错误。当你请求'GET /'时你明白了吗?那么'GET/login'呢? 'POST /登录'? –

+0

对不起,忘了提。错误发生在'''POST/login'''请求中。索引页('''res.render('users/index');''')被渲染,但控制台给出错误。会话似乎工作正常,渲染也发生,但仍然得到消息 –

+1

你可能有多个用户使用相同的用户名,所以当你找到一个密码错误的时候,它会发送一个响应,但是当你罚款一个使用正确的密码,它会发送另一个响应。您只能发送1个响应,否则您正尝试在发送标头后发送标头。 –

回答

1

你的问题是,你的数据库查找返回的每个结果值都与你在调用res.render()的密码和用户名相匹配。每次请求只能拨打res.render()一次。所以从理论上讲,如果只有1个用户返回并且他们的密码匹配,但是如果同一个用户存在多次并且具有相同的密码,您将在发送一次之后致电res.render(),则理论上这将起作用。

我的建议是遍历返回的用户列表,然后在匹配的第一次后突然出现。

+1

谢谢,有2名用户在数据库中有相同的名字,所以导致了这个问题。感谢您的帮助! –

相关问题