【问题标题】:Express3 JS - Accessing and setting session data in routesExpress3 JS - 在路由中访问和设置会话数据
【发布时间】:2013-03-29 19:17:03
【问题描述】:

我正在尝试在 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);

【问题讨论】:

  • 究竟是什么不起作用?它是给你一个错误,还是下一个请求中根本不存在这些值?如果是后者,请发布您用于从会话中读取值的代码。
  • req.session 仅在您使用app.use'd express.session 中间件(取决于express.cookieParser 本身)之后才存在。
  • @NickMitchinson 似乎是 connection.query 的回调无法访问 req 的问题。我所做的所有检查会话中的值都是 console.log(req.session)
  • @NickMitchinson 我已经添加了完整的代码块......
  • @NickMitchinson TypeError: 无法读取未定义的属性“会话”

标签: node.js express node-mysql


【解决方案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() 所在的位置(但是,这可能会或可能不会起作用,具体取决于您使用的库是在结束之前等待现有查询,还是干脆杀死它们)

【讨论】:

  • 您可能希望在回调中处理错误而不是抛出它。如果不这样做,错误将被抛出回调之外,并且不会发送响应。如果您确实想抛出错误而不是处理它,请确保在您这样做之前结束响应,否则客户端将等待响应。
  • 干杯,我应该知道的!是的,我目前正在为数据库使用 node-mysql 模块。计划使用 mongodb。只是先掌握节点并表达。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 2018-11-11
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多