기본적으로 로그인 양식에서 게시물에 대해 작동하는 다음 경로가 있습니다. 문제는 로그인이 성공하고 (구성원이 발견되고 암호가 일치하는 경우) member._id가 세션에 저장되지 않는다는 것입니다.Node.js의 Express에 세션이 저장되지 않습니다.
내 경로 :
app.post('/signin', function(req, res) {
Member.findOne({username: req.body.username}, function(error, member) {
var matchPassword = crypto.createHmac('sha1', member.salt).update(req.body.password).digest('hex');
if(member.password == matchPassword) {
req.session.member_id = member._id;
res.redirect('/' + member.username);
}
});
res.redirect('/');
});
나는이 경로는 해고 콘솔에서 다음과 같은 오류 얻을 :
node.js:134
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/Users/admin/Node Projects/sandboxProject/node_modules/express/node_modules/connect/lib/patch.js:62:20)
at ServerResponse.header (/Users/admin/Node Projects/sandboxProject/node_modules/express/lib/response.js:280:8)
at ServerResponse.redirect (/Users/admin/Node Projects/sandboxProject/node_modules/express/lib/response.js:413:10)
at Promise.<anonymous> (/Users/admin/Node Projects/sandboxProject/app.js:109:8)
at Promise.<anonymous> (/Users/admin/Node Projects/sandboxProject/node_modules/mongoose/lib/promise.js:120:8)
at Promise.<anonymous> (events.js:64:17)
at Promise.emit (/Users/admin/Node Projects/sandboxProject/node_modules/mongoose/lib/promise.js:59:38)
at Promise.complete (/Users/admin/Node Projects/sandboxProject/node_modules/mongoose/lib/promise.js:70:20)
at /Users/admin/Node Projects/sandboxProject/node_modules/mongoose/lib/query.js:1087:15
'(그것은 "res.redirect을 좋아하지 않는 것으로 보인다을/'+ member.username); " "req.session.member_id = member._id;"다음에. 이것이 존재하는 몽구스 findOne 콜백의 비동기 특성 때문입니까? 콜백에서 res.redirect를 제거하려고했지만 세션 데이터가 저장되지 않고 거기에두면 "헤더가 이미 전송되었습니다"라는 오류가 발생합니다.
내 구성 :
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.cookieParser());
app.use(express.session({ secret: "blahblah" }));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
이 문제를 해결했습니다 :
이 내 질문입니다! Mongoose의 콜백이 비동기이며 "res.redirect ('/');" 내 이전의 깨진 버전의 경로. 콜백 내에서 실패를 처리하고 "res.redirect ('/');"를 삭제하면됩니다. 경로 콜백의 끝에서. 죄송합니다. –
아래 해결 방안이 효과가 있다면, 같은 문제를 가진 다른 사람들을 돕기 위해 올바른 대답으로 하나를 선택할 수 있습니까? – Brandon