Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js&;节点Postgres:将查询放入模型_Javascript_Node.js_Postgresql - Fatal编程技术网

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)
。它也需要回调。我