0

我在我的 express 应用程序中构建了一系列数据库查询,这些查询驻留在一个/models/index.js文件中,我可以app.js通过var express = require('express');. 我正在尝试req.session.user使用由 a 返回的用户 ID填充findByEmail();/models/index.js使用.

findByEmail();函数工作正常,但是我不知道如何将其返回值存储在req.session. 我试过包含req.session.id = result.rows[0].id;在'findByEmail();function, but this returns areq 未定义`错误。

我是否忽略了文件require中的一个简单语句,/models/index.js或者是否有其他访问技巧req.session

我已经包含了相关代码/models.index.js下面的相关代码:

/models.index.js:

var pg = require('pg');

function findByEmail(email){
  pg.connect(function(err, client, done) {
    if(err) {
      console.log('pg.connect error');
      throw err;
    }
    client.query('BEGIN', function(err) {
      if(err) {
        console.log('client.query BEGIN error');
        return rollback(client, done);
      }
      process.nextTick(function() {
        var text = "SELECT * FROM users WHERE email = $1";
        client.query(text, [email], function(err, result) {
          if(err) {
            console.log(err);
            return rollback(client, done);
          }
          console.log(result);
          console.log(result.rows);
          console.log('id: ', result.rows[0].id);
          req.session.id = result.rows[0].id;
          done();
        });
      });
    });
  });
}
module.exports.pg = pg;
exports.findByEmail = findByEmail;
4

1 回答 1

3

/models/index.js了解,req未定义,与rollback. 模块是一个闭包,您无法访问在它之外定义的变量。如果你想这样做,你必须将它们作为参数传递,但这不是很好的设计,正如@gustavohenke 所说:关注点分离。您可能希望有一个回调并使用成功/错误调用它并在那里设置会话 ID,这样您就不必传入模块:

function findByEmail(email,callback){
  pg.connect(function(err, client, done) {
    if(err) {
      console.log('pg.connect error');
      throw err;
    }
        // Do all the async work and when you are done ...
        // An error is usually passed as the first parameter of the callback
        callback(err,result)
  });
}
exports.findByEmail = findByEmail;

然后你会这样称呼它:

var models = require('./models');

models.findByEmail('thedude@lebowski.com',function(err,results) {
  // set session id here where you probably have access to the req object...
})
于 2013-10-19T00:33:20.177 回答