我在使用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?
这将有助于了解何时出现此错误。当你请求'GET /'时你明白了吗?那么'GET/login'呢? 'POST /登录'? –
对不起,忘了提。错误发生在'''POST/login'''请求中。索引页('''res.render('users/index');''')被渲染,但控制台给出错误。会话似乎工作正常,渲染也发生,但仍然得到消息 –
你可能有多个用户使用相同的用户名,所以当你找到一个密码错误的时候,它会发送一个响应,但是当你罚款一个使用正确的密码,它会发送另一个响应。您只能发送1个响应,否则您正尝试在发送标头后发送标头。 –