Javascript Node.js&;节点Postgres:将查询放入模型
我想将我的查询“功能化”,将它们放入具有适当任务名称的函数中 我希望避免将所有内容都放在Javascript Node.js&;节点Postgres:将查询放入模型,javascript,node.js,postgresql,Javascript,Node.js,Postgresql,我想将我的查询“功能化”,将它们放入具有适当任务名称的函数中 我希望避免将所有内容都放在req,res函数(我的控制器)中,而是将它们放在各种“模型”中,即另一个JavaScript文件,该文件将被导入并用于运行代表控制器执行查询和返回结果的函数 假设我有以下查询设置: UserController.js exports.userAccount = function(req, res, next) { var queryText = "\ SELECT *\
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
});
});
});
}
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;
};
在这里,当我在查询中时,我基本上重定向并呈现一个包含数据的页面。那很好。但是我想取出所有的pg.connect
和client.query
code并将其移动到一个单独的文件中作为模型导入。我得出以下结论:
UserModel.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
});
});
});
}
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);
查询以这种方式执行得非常好-除了用户
对象没有被正确分配(我假设存在范围问题),而且我无法理解它
目标是能够从控制器调用函数(如上面的函数),让模型执行查询并将结果返回给控制器
我是否遗漏了一些显而易见的东西?
pgconnect
是一个异步调用。在继续下一行之前,它不会等待数据从数据库返回,而是在Postgres回答之前继续程序的其余部分。因此,在上面的代码中,findUser
返回一个尚未填充的变量
为了使其正常工作,必须向findUser
函数添加回调。(我在上一次编辑中告诉您错误:调用pg.connect中的done
参数是为了将连接释放回连接池。)最终结果应如下所示:
exports.findUser = function(id, callback) {
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) {
user = result.rows;
done(); // Releases the connection back to the connection pool
callback(err, user);
});
});
return user;
};
var user = myModule.findUser(id);
myModule.findUser(id, function(err, user){
// do something with the user.
});
你会使用它,而不是像这样:
exports.findUser = function(id, callback) {
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) {
user = result.rows;
done(); // Releases the connection back to the connection pool
callback(err, user);
});
});
return user;
};
var user = myModule.findUser(id);
myModule.findUser(id, function(err, user){
// do something with the user.
});
但就像这样:
exports.findUser = function(id, callback) {
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) {
user = result.rows;
done(); // Releases the connection back to the connection pool
callback(err, user);
});
});
return user;
};
var user = myModule.findUser(id);
myModule.findUser(id, function(err, user){
// do something with the user.
});
如果您有几个步骤要执行,每个步骤都依赖于以前异步调用的数据,那么最终会出现令人困惑的、初始阶段风格的嵌套回调。有几个异步库可以帮助您提高此类代码的可读性,但最流行的是npm的
async
模块。pgconnect
是一个异步调用。在继续下一行之前,它不会等待数据从数据库返回,而是在Postgres回答之前继续程序的其余部分。因此,在上面的代码中,findUser
返回一个尚未填充的变量
为了使其正常工作,必须向findUser
函数添加回调。(我在上一次编辑中告诉您错误:调用pg.connect中的done
参数是为了将连接释放回连接池。)最终结果应如下所示:
exports.findUser = function(id, callback) {
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) {
user = result.rows;
done(); // Releases the connection back to the connection pool
callback(err, user);
});
});
return user;
};
var user = myModule.findUser(id);
myModule.findUser(id, function(err, user){
// do something with the user.
});
你会使用它,而不是像这样:
exports.findUser = function(id, callback) {
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) {
user = result.rows;
done(); // Releases the connection back to the connection pool
callback(err, user);
});
});
return user;
};
var user = myModule.findUser(id);
myModule.findUser(id, function(err, user){
// do something with the user.
});
但就像这样:
exports.findUser = function(id, callback) {
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) {
user = result.rows;
done(); // Releases the connection back to the connection pool
callback(err, user);
});
});
return user;
};
var user = myModule.findUser(id);
myModule.findUser(id, function(err, user){
// do something with the user.
});
如果您有几个步骤要执行,每个步骤都依赖于以前异步调用的数据,那么最终会出现令人困惑的、初始阶段风格的嵌套回调。有几个异步库可以帮助您提高此类代码的可读性,但最流行的是npm的
async
模块。pgconnect
是一个异步调用。在继续下一行之前,它不会等待数据从数据库返回,而是在Postgres回答之前继续程序的其余部分。因此,在上面的代码中,findUser
返回一个尚未填充的变量
为了使其正常工作,必须向findUser
函数添加回调。(我在上一次编辑中告诉您错误:调用pg.connect中的done
参数是为了将连接释放回连接池。)最终结果应如下所示:
exports.findUser = function(id, callback) {
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) {
user = result.rows;
done(); // Releases the connection back to the connection pool
callback(err, user);
});
});
return user;
};
var user = myModule.findUser(id);
myModule.findUser(id, function(err, user){
// do something with the user.
});
你会使用它,而不是像这样:
exports.findUser = function(id, callback) {
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) {
user = result.rows;
done(); // Releases the connection back to the connection pool
callback(err, user);
});
});
return user;
};
var user = myModule.findUser(id);
myModule.findUser(id, function(err, user){
// do something with the user.
});
但就像这样:
exports.findUser = function(id, callback) {
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) {
user = result.rows;
done(); // Releases the connection back to the connection pool
callback(err, user);
});
});
return user;
};
var user = myModule.findUser(id);
myModule.findUser(id, function(err, user){
// do something with the user.
});
如果您有几个步骤要执行,每个步骤都依赖于以前异步调用的数据,那么最终会出现令人困惑的、初始阶段风格的嵌套回调。有几个异步库可以帮助您提高此类代码的可读性,但最流行的是npm的
async
模块。pgconnect
是一个异步调用。在继续下一行之前,它不会等待数据从数据库返回,而是在Postgres回答之前继续程序的其余部分。因此,在上面的代码中,findUser
返回一个尚未填充的变量
为了使其正常工作,必须向findUser
函数添加回调。(我在上一次编辑中告诉您错误:调用pg.connect中的done
参数是为了将连接释放回连接池。)最终结果应如下所示:
exports.findUser = function(id, callback) {
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) {
user = result.rows;
done(); // Releases the connection back to the connection pool
callback(err, user);
});
});
return user;
};
var user = myModule.findUser(id);
myModule.findUser(id, function(err, user){
// do something with the user.
});
你会使用它,而不是像这样:
exports.findUser = function(id, callback) {
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) {
user = result.rows;
done(); // Releases the connection back to the connection pool
callback(err, user);
});
});
return user;
};
var user = myModule.findUser(id);
myModule.findUser(id, function(err, user){
// do something with the user.
});
但就像这样:
exports.findUser = function(id, callback) {
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) {
user = result.rows;
done(); // Releases the connection back to the connection pool
callback(err, user);
});
});
return user;
};
var user = myModule.findUser(id);
myModule.findUser(id, function(err, user){
// do something with the user.
});
如果您有几个步骤要执行,每个步骤都依赖于以前异步调用的数据,那么最终会出现令人困惑的、初始阶段风格的嵌套回调。有几个异步库可以帮助您提高此类代码的可读性,但最流行的是npm的
async
模块。谢谢您的回答-我忘记了done
调用;但是,在pg.connect
函数之外,我仍然得到一个空的user
对象。我只是不确定从pg.connect
/client.query
获取结果的正确方法是什么。。。有人会认为,done(results)
可以做到这一点,但这不是我看到的。因为findUser包含一个异步方法,这使得它也是异步的,所以您不能使用它来分配变量,比如var user=findUser(id)
。它也需要回调。我