Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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 如何从pg promise中的db.any()promise中获取值?_Javascript_Node.js_Express_Pg Promise - Fatal编程技术网

Javascript 如何从pg promise中的db.any()promise中获取值?

Javascript 如何从pg promise中的db.any()promise中获取值?,javascript,node.js,express,pg-promise,Javascript,Node.js,Express,Pg Promise,我使用pg promise,并尝试向用户模型中的数据库发出请求,以获得所有用户的数组,如下所示: exports.getAllUsers = function () { let users = db.any("SELECT * FROM users;").then(function (data) { return data; // in debug mode data is my expected array }); r

我使用pg promise,并尝试向用户模型中的数据库发出请求,以获得所有用户的数组,如下所示:

 exports.getAllUsers = function () {
      let users = db.any("SELECT * FROM users;").then(function (data) {
        return data; // in debug mode data is my expected array 
      });
      return users;
    };
但当我从控制器发出get请求时,它返回PROMITE PROMITE{},而不是我所期望的json对象数组。 有一个控制器:

exports.getUsers = function (req, res) {
   let users = userModel.getAllUsers();
   console.log(users); // here it outputs Promise { <pending> }
   res.json(users);
 };

如何获得数组而不是承诺?

如果您认为代码会像您编写的那样工作,恐怕您还没有真正理解承诺是什么,它们解决了什么问题,以及它们是如何工作的

让我们把你的代码分解一下。您正在导出设计的函数getUsers,它应该返回一系列用户对象。但是它没有-db。任何。。。返回一个。您认为还可以如何调用返回的对象,然后将另一个函数传递给,以处理作为参数传递给该函数的实际数据。这意味着,实际上,数据传递给调用db返回值的then调用。any。。。call,是您要查找的用户序列

您犯的错误是假设如果您从传递给then的回调返回数据,它将成为then的返回值。。。呼叫不会的。然后总是返回一个承诺-无论您从回调返回什么,都将成为返回承诺的解析值,但返回的是承诺,这就是为什么您的用户变量是承诺

您需要阅读更多关于承诺的内容,以及如何在运行脚本之间异步解析承诺,以及如何在承诺上同步代码

提示:使用wait关键字等待并使用给定承诺的值,例如从传递给用户的回调返回的值,然后。。。调用或接受getUsers函数的设计,返回一个承诺,并调整其余代码以使用该承诺,而不使用wait

您的getAllUsers功能可以简化为:

exports.getAllUsers=函数{ 从用户返回db.anySELECT*;; } …使用Wait,您可以像这样使用它:

让用户=等待getUsers; 上面的语句必须是标记为async的函数的一部分-ECMAScript需要显式标记这些语句以允许使用等待表达式:

异步函数{ 让用户=等待getUsers; /// ... } 调用异步函数(如包含上述语句的函数)的脚本的执行将在每个等待表达式处被JavaScript解释器中断,并在等待关键字后表示的承诺解析为值并将值分配给用户变量时恢复

使用async和await确实需要一个能够支持它们的Node.js版本,但在撰写本文时,当前版本已经提供了支持

Oherwise您仍然可以保留getUsers函数,但您需要以不同的方式使用它,因为您不能使用await-必须像引入await和async之前那样使用承诺,例如:

getUsers.thenusers=>{ ///对“users”数组执行一些操作。 };
无论如何,在您对承诺如何工作的理解上似乎存在一些漏洞,我建议您这次通过阅读这些漏洞来填补这些漏洞,而不仅仅是直接阅读基于它们的pg promise API。

就像您已经发现的userModel.getAllUsers将返回一个承诺,而不是一个数组。你需要等待这个承诺得到解决。这可以使用an来完成

请注意,异步函数将始终返回承诺

或者你也可以使用返回承诺的方法

exports.getUsers = function (req, res) {
   userModel.getAllUsers().then(users => {
     console.log(users);
     res.json(users);
   });
};

您正在返回then函数调用的返回值。你认为那个电话会有什么回音?它返回一个Promise对象。@amn好的,明白了。但是如何获得我想要的价值呢?在调试模式下,“数据”是一个数组。我向您保证,作为数组的数据与调试模式无关-传递给then的回调始终使用您随后调用的已解析承诺的值进行调用。如果db.any返回的承诺与数组解析,那么数据就是该数组的句号。如果你想向我保证这是调试模式的话,一定还有别的东西在起作用。当然,解析值的类型可以根据不同的情况而有所不同,但这将是pg-PROMITE的内部工作。一般来说,return wait是一种反模式。我将详细说明如何进一步减少函数,消除反模式。
exports.getUsers = function (req, res) {
   userModel.getAllUsers().then(users => {
     console.log(users);
     res.json(users);
   });
};