我在我的快递应用中构建了一系列数据库查询,这些查询位于/models/index.js
文件中,我可以通过app.js
从var express = require('express');
访问该文件。我正在尝试使用req.session.user
中findByEmail();
函数返回的用户ID填充/models/index.js
。
findByEmail();
函数工作正常,但我无法弄清楚如何在req.session
中存储其返回值。我已尝试在{findByEmail(); req.session.id = result.rows[0].id;
req未定义`错误中包含function, but this returns a
。
我是否在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;
答案 0 :(得分: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...
})