0

node-mysql クエリ コールバック内で nodejs サーバー セッション変数にアクセスしようとしていますが、req.session 内の変数にアクセスまたは設定できないようです。

connection.connect();   
    connection.query('SELECT id, firstname, lastname FROM users WHERE username = ? AND password = ?', [username, password] , function(err, rows, fields) {
        if (err) throw err;
        console.log(rows.length);

        if(rows.length > 0){
            console.log('Firstname: ' + rows[0]['firstname'] + ' Last Name: ' + rows[0]['lastname']);
            req.session.firstname = rows[0]['firstname'];
            req.session.lastname = rows[0]['lastname'];
        } else {
            console.log('No Results');
        }
    }); 
    connection.end();

上記のように、セッションが正しく機能していることを確認するためのテストとして、名前と姓をセッションに追加しようとしていますが、これは最終的に認証システムの一部になります。

これを達成するための最良の方法は何ですか。いくつかの重要なミドルウェアがありませんか?

編集:これはroutes.login_processの完全なコードです

var mysql = require('mysql');
var md5 = require('MD5');

exports.login_process = function(req, res){
    var username = req.body.username;
    var password = md5(req.body.password);

    var connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'root',
        database : 'node',
        password : 'test',
    });

    connection.connect();   
    connection.query('SELECT id, firstname, lastname FROM users WHERE username = ? AND password = ?', [username, password] , function(err, rows, fields) {
        if (err) throw err;
        console.log(rows.length);

        if(rows.length > 0){
            console.log('Firstname: ' + rows[0]['firstname'] + ' Last Name: ' + rows[0]['lastname']);
            req.session.firstname = result[0]['firstname'];
            req.session.lastname = result[0]['lastname'];
        } else {
            console.log('No Results');
        }
    });
    connection.end();

    res.writeHead(200);
    res.end();
    //res.redirect('http://www.bbc.co.uk');
}

これは /login に投稿されたフォームから投稿されています

app.post('/login', routes.login_process);
4

1 に答える 1

1

問題は、クエリが非同期であり、接続が開始された後に res.end() が同期的に発生しているため、クエリのコールバックが実行される前にリクエストが終了することです。応答が終了すると、要求オブジェクトは参照できなくなります。コードを次のように変更します。

connection.connect();   
connection.query('SELECT id, firstname, lastname FROM users WHERE username = ? AND password = ?', [username, password] , function(err, rows, fields) {
    if (err) throw err;
    console.log(rows.length);

    if(rows.length > 0){
        console.log('Firstname: ' + rows[0]['firstname'] + ' Last Name: ' + rows[0]['lastname']);
        req.session.firstname = result[0]['firstname'];
        req.session.lastname = result[0]['lastname'];
    } else {
        console.log('No Results');
    }

    res.writeHead(200);
    res.end();
});

connection.end();

これにより、クエリが完了するまで応答が待機します。

connection.end() がどこに行かなければならないのか正確にはわからないことに注意してください。配置した場所で機能しない場合は、 res.end() がある場所に移動してみてください(ただし、使用しているライブラリが終了する前に既存のクエリを待機するか、単にそれらを強制終了するかによって、これが機能する場合と機能しない場合があります)

于 2013-03-29T20:00:43.860 に答える