3

基本的にログインフォームからの投稿に作用する次のルートがあります。問題は、ログインが成功した場合 (メンバーが見つかり、パスワードが一致した場合)、member._id がセッションに保存されないことです。

私のルート:

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;」の後。これは、Mongoose の 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'));
});
4

3 に答える 3

8

同様の問題がありました。私の問題は、セッションから何かを削除したとき、たとえばdelete req.session.user、リロードしてノードアプリを再起動した後もまだそこにあるということでした。それは後にのみなくなりreq.session.destroy()ます。

Node のセッションミドルウェア ドキュメントを調べたところ、メソッドがあることがわかりましたSession#save()。そのreq.session.save()ため、セッションオブジェクトの操作後に行ったところ、問題は解決しました。試してみて、問題が解決するかどうかを確認してください。

于 2012-06-28T15:47:43.120 に答える
4

問題は、それMember.findOneが非同期であることです。そのコールバックが実行されるまでに、res.redirect('/')はすでに実行されており、適切な HTTP 応答ヘッダーが設定されています。HTTP ルールによってヘッダーを 2 回送信することはできないため、エラーが発生しますCan't set headers after they are sent.

redirect('/')おそらく、パスワード マッチングの else ブロックに移動したいと思うでしょう。

于 2012-09-05T13:26:55.397 に答える
0

同様の問題がありました。しかし、私の問題はその時です:

request.session.user = ユーザー;

デバッグで発見, この行をコメントアウトすると,このエラーは発生しません:</p>

// request.session.user = ユーザー;

これは私の質問です: express 4.x session-mongoose 送信後にヘッダーを設定できません (解決済み)

于 2015-01-21T03:02:07.920 に答える