ルーティング用ExpressでNode.jsアプリケーションを、データベース用にMongoDB(Mongolab)を設定する際に問題があります。私は&を見ていて、同じ問題を抱えている他の多くのユーザーを見つけましたが、まだ問題の解決策を見つけることができませんでした。誰かが助けてくれることを願っています。node.js/expressアプリケーションのエラー:送信後にヘッダーを設定できません
私は入れませんエラーは、私がPOST /login
要求後にエラーが発生しますError: Can't set headers after they are sent.
です。 私は、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の上で同様の問題の多くをチェックしましたが、まだ私の問題を解決することができませんでした!
ちょうど考えを思い付いた:
問題はMongoDBの(mongolab)がHerokuの上に設定されている間、私は、ローカルホスト上でテストしてることだろうか?
このエラーが発生したときに役立つはずです。あなたが 'GET /'を要求したときにそれを手に入れますか? 'GET/login'はどうですか? 'POST/login'? –
申し訳ありませんが、忘れてしまいました。このエラーは、 '' POST/login''要求で発生します。インデックスページ( '' 'res.render( 'users/index');' ')はレンダリングされますが、コンソールはエラーを返します。セッションは正常に動作しているように見えますが、レンダリングも行われますが、依然としてメッセージが表示されます –
同じユーザー名を持つ複数のユーザーがいる可能性が高いので、間違ったパスワードを持つユーザーを見つけたらレスポンスを送信しますが、正しいパスワードで別の応答を送信します。 1つのレスポンスしか送信できません。それ以外の場合は、すでに送信された後にヘッダーを送信しようとしています。 –