さらに別の「node.js/expressの学習を始めたばかりで、今は行き詰まっている」人がここにいます。私はどこでも答えを探してみましたが、行き止まりに達しました。これは私の最初の Stackoverflow の質問です。間違ったことや型破りなことをしたかどうか教えてください。
ユーザー オブジェクトを高速セッション (MongoDB 上) に保存し、セッション情報を処理する URL にリダイレクトする POST 要求を作成しようとしています。
問題は、ヘッダーが設定される前にユーザーがリダイレクトされ、次のように表示されることです。
Error: Can't set headers after they are sent.
これが私のコードです。私はそれがたくさんあることを知っています..申し訳ありません。
ルーター.post()
// Handler for POST requests from root page (/)
router.post('/', function(req, res) {
console.log("Router: A POST request for: \"/\" has been called!");
var username = req.body.username;
var password = req.body.password;
// Connect to database
mongoose.connect(dbAddress);
var db = mongoose.connection;
// Report if error in connection
db.on('error', console.error.bind(console, 'Database: Connection error..'));
// Callback function on 'open'
db.once('open', function() {
console.log("Database: Connection successful!");
console.log("Database: User supplied username: " + username);
console.log("Database: User supplied password: " + password);
// Find User object with a userId of req's username
User.findOne({ 'userId' : username.toUpperCase() }, function(err, userObj) {
if (err)
return console.err(err);
// Disconnect when done retrieving user object
mongoose.disconnect();
if ( userObj ) {
console.log("Database: Returned password from MongoDB:");
console.log(userObj.password);
var db_password = userObj.password;
if (password === db_password) {
console.log("Database: User Authenticated");
// Set 'req.session.user' as cookie
req.session.user = userObj;
// Redirect to homepage, with new cookie set
res.redirect('/');
} else { // If passwords don't match
res.render('index', {
showError: true
});
}
} else { // If userObj is null
res.render('index', {
showError: true
});
}
});
});
});
「req.session.user = userObj」の部分に注意してください。ここでは、セッションの「ユーザー」を MongoDB から取得したユーザー オブジェクトに設定しようとしています。次の行では、セッション情報に基づいてユーザーを処理する '/' の GET 要求ハンドラーにユーザーをリダイレクトしています。
何らかの理由で、これらは順番に発生していません。GET リクエスト ハンドラが req.session.user を見つけられません。
node.js はすべて非同期であることを理解していますが、オンラインで見つけた他の例から、これは機能するはずです。ここで何が欠けていますか?