2017-03-31 20 views
0

ルーティング用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の上に設定されている間、私は、ローカルホスト上でテストしてることだろうか?

+1

このエラーが発生したときに役立つはずです。あなたが 'GET /'を要求したときにそれを手に入れますか? 'GET/login'はどうですか? 'POST/login'? –

+0

申し訳ありませんが、忘れてしまいました。このエラーは、 '' POST/login''要求で発生します。インデックスページ( '' 'res.render( 'users/index');' ')はレンダリングされますが、コンソールはエラーを返します。セッションは正常に動作しているように見えますが、レンダリングも行われますが、依然としてメッセージが表示されます –

+1

同じユーザー名を持つ複数のユーザーがいる可能性が高いので、間違ったパスワードを持つユーザーを見つけたらレスポンスを送信しますが、正しいパスワードで別の応答を送信します。 1つのレスポンスしか送信できません。それ以外の場合は、すでに送信された後にヘッダーを送信しようとしています。 –

答えて

1

あなたの問題は、パスワードとユーザ名が一致するDB検索によって返される各結果値に対して、res.render()です。リクエストごとに1回だけres.render()に電話をかけることができます。理論的には、これは1人のユーザーだけが返され、そのパスワードが一致しても、同じユーザーが複数存在し、同じパスワードを持っていれば、すでに一度送信された後にres.render()に電話をかけようとした場合に動作します。

私の提案は、返されたユーザーのリストを繰り返し、最初に一致した後で中断することです。

+1

ありがとう、DBに同じ名前の2人のユーザーがいたため、問題が発生しました。助けてくれてありがとう! –

関連する問題