【问题标题】:Getting results from the asynchronus query in nodejs从nodejs中的异步查询中获取结果
【发布时间】:2019-12-26 21:03:21
【问题描述】:

我正在从数据库中提取一些数据,以便在我的 nodejs 应用程序中使用它。 我正在使用 node-postgres 连接到数据库 (https://node-postgres.com/)。

我多次阅读指南并尝试以不同方式查询它(回调、承诺、使用池和客户端),但总是出错。

const { Pool } = require('pg');

const pool = new Pool({
  user: 'user',
  host: 'host',
  database: 'db',
  password: 'pass',
  port: port,
});

pool.query('SELECT * from table').then(res=> {
var projects = res.rows; 
console.log(projects); 
return projects;
});

//... few other operations on projects data to follow before exports

exports.raw = projects;

我可以在控制台输出中看到数据,所以连接正常,但是当我尝试运行代码时,我得到了

ReferenceError: projects is not defined.

感谢您对此提供的任何帮助。

【问题讨论】:

标签: javascript node.js postgresql asynchronous


【解决方案1】:

试试async/await 语法:

let projects;

(async () => {
    const res = await pool.query('SELECT * from table');
    projects = res.rows;
})();

exports.raw = projects;

【讨论】:

  • async 也返回一个承诺。它与在 OPs sn-p 中使用 .then 没有什么不同。
  • 我的异步函数没有返回任何内容。这不是重点。我定义projects
  • 这就是重点。你将不得不兑现承诺直到最后。这就是事件循环的工作方式,您的 module.exports 不会等待自调用函数完成。还有为什么要自调用函数?它将在您导入模块的同时执行。为什么即使在不需要的情况下你也想要获取完整的数据。
  • 呃,好吧,我不明白为什么我应该返回一个 Promise。回到什么?只要定义了projects?另外,你确定module.exports 不会等待async 函数吗?为什么不呢,因为我们await 来电了?
  • 返回到客户端的下一个方法。是的,我确信module.exports 不会等待。 awaitasync 内部而不是外部是强大的在线。检查小提琴jsfiddle.net/fsed9zco
【解决方案2】:

你可以通过async/await代码格式简单实现

users.js

const users = {};

const { Pool } = require('pg');

const pool = new Pool({
  user: 'user',
  host: 'host',
  database: 'db',
  password: 'pass',
  port: process.env.port,
});

users.getUsers = async () => {
  try {
    const result = await pool.query('SELECT * FROM users');
    console.log(result);
    return result;
  } catch (err) {
    console.error(err);
    throw err;
  }
};

module.exports = users;

friends.js

const friends = {};

const users = require('./users');

friends.getSampleData = async () => {
  try {
    const result = await users.getUsers();
    console.log(result);
    return result;
  } catch (err) {
    console.error(err);
    throw err;
  }
};

module.exports = friends;

注意 async/await 仅适用于返回 Promise 的函数。

【讨论】:

    【解决方案3】:

    就像 Jeremy 回答的那样,创建一个 getter 方法来获取数据,不要在需要之前尝试存储它。

    const fetchData = async() => {
      const res = await pool.query('SELECT * from table')
      return res.rows;
    }
    
    const myDesiredData = fetchData()
    

    【讨论】:

    • 此变量 myDesiredData 应该位于您要获取数据的其他文件中。 Module.exports 应该包含 fetchData 方法。
    • 您好,感谢您的回答。刚刚尝试过,但现在我在控制台日志中得到了 Promise { }。
    • 尝试将 await 放在该方法调用之前,您将获得该值。
    • 并且调用 fetchData 的方法应该被标记为异步。
    • 类似这样的东西 const someThirdMethod = async () => { const myUsers = await fetchData() }
    猜你喜欢
    • 1970-01-01
    • 2011-08-14
    • 2019-08-08
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 2020-06-01
    相关资源
    最近更新 更多