【发布时间】:2014-06-12 03:18:52
【问题描述】:
我想将我的查询“功能化”,方法是将它们放入具有适合任务名称的函数中。
我想避免将所有内容都放在 req, res 函数(我的控制器)中,而是将它们放在各种“模型”中,即另一个 JavaScript 文件,该文件将被导入并用于运行执行查询的函数并代表控制器返回结果。
假设我有以下查询设置:
UserController.js
exports.userAccount = function(req, res, next) {
var queryText = "\
SELECT *\
FROM users\
WHERE id = $1\
";
var queryValues = [168];
pg.connect(secrets.DATABASE_URL, function(err, client, done) {
client.query(queryText, queryValues, function(err, result) {
res.render('pathToSome/page', {
queryResult: result.rows
});
});
});
}
在这里,当我在查询中时,我实质上是重定向并呈现包含数据的页面。这很好用。但我想取出所有pg.connect 和client.query 代码并将其移动到单独的文件中以作为模型导入。我想出了以下几点:
UserModel.js
exports.findUser = function(id) {
// The user to be returned from the query
// Local scope to 'findUser' function?
var user = {};
var queryText = "\
SELECT *\
FROM users\
WHERE id = $1\
";
var queryValues = [id];
pg.connect(secrets.DATABASE_URL, function(err, client, done) {
client.query(queryText, queryValues, function(err, result) {
// There is only ever 1 row returned, so get the first one in the array
// Apparently this is local scope to 'client.query'?
// I want this to overwrite the user variable declared at the top of the function
user = result.rows;
// Console output correct; I have my one user
console.log("User data: " + JSON.stringify(user));
});
});
// I expect this to be correct. User is empty, because it was not really
// assigned in the user = result.rows call above.
console.log("User outside of 'pg.connect': " + JSON.stringify(user));
// I would like to return the user here, but it's empty!
return user;
};
我这样调用我的模型函数:
var user = UserModel.findUser(req.user.id);
查询以这种方式执行得非常好 - 除了 user 对象没有被正确分配(我假设 scope 问题),我无法弄清楚。
目标是能够从控制器调用一个函数(如上面的函数),让模型执行查询并将结果返回给控制器。
我在这里遗漏了什么明显的东西吗?
【问题讨论】:
标签: javascript node.js postgresql