gpt4 book ai didi

javascript - Node.js 和 Node-Postgres : Putting Queries into Models

转载 作者:行者123 更新时间:2023-11-29 14:21:33 24 4
gpt4 key购买 nike

我想通过将查询放入具有适合任务名称的函数中来“功能化”我的查询。

我想避免将所有内容都放在 req, res 函数(我的 Controller )中,而是将它们放在各种“模型”中,即另一个将被导入和使用的 JavaScript 文件运行执行查询并代表 Controller 返回结果的函数。

假设我有以下查询设置:

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.connectclient.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 问题),我可以'想不通。

目标是能够从 Controller 调用函数(如上面的函数),让模型执行查询并将结果返回给 Controller 。

我是否遗漏了一些明显的东西?

最佳答案

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.
});

如果您有多个步骤要执行,每个步骤都依赖于先前异步调用的数据,您最终会遇到令人困惑的 Inception 风格的嵌套回调。有几个异步库可以帮助您提高此类代码的可读性,但最受欢迎的是 npm 的 async 模块。

关于javascript - Node.js 和 Node-Postgres : Putting Queries into Models,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24168989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com