异步函数不需要 return 值

async function doesn't return value required

我正在尝试使用 async/await 从 postresql 数据库获取数据。我面临的问题是 fetchMembers 加载了数据,但它没有 return 该数据,而只是一个空白对象。

//server.js
const members = require('./memberDB')

app.get('/' , (req, res) => {
    res.json(members)
    console.log('Members: ',JSON.stringify(members))
})

//MemberDB.js

const fetchMembers =  async function() {

    const { Client, Pool } = require('pg')

    const pool = new Pool({
      user: 'user',
      host: 'localhost',
      database: 'whatevs',
      password: '',
      port: 5432,
    })

    const loadData = await pool.query('SELECT * FROM members;')
    const data = await loadData.rows
    console.log('data -> ', data)//I get this data correctly

    return data // but I don't get the return value even if I remove 'await' from the 'loadData.rows'
}

module.exports.members = fetchMembers()

将函数包装在 try catch 语句中,这样就不会出现静默错误,例如:

const fetchMembers =  async () => {
    try
    {
       const { Pool } = require('pg')

       const pool = new Pool({
         user: 'user',
         host: 'localhost',
         database: 'whatevs',
         password: '',
         port: 5432,
       })

       return await pool.query('SELECT * FROM members;')
    }
    catch(reason){
        console.log(reason)
    }
}

console.log(fetchMembers())

使 fetchMembers return 成为一个承诺并在请求处理程序中等待它。

 const fetchMembers =  async function() {

    const { Client, Pool } = require('pg')

    const pool = new Pool({
      user: 'user',
      host: 'localhost',
      database: 'whatevs',
      password: '',
      port: 5432,
    })

    return pool.query('SELECT * FROM members;')        
}
module.exports.members = fetchMembers;

在路线中:

    app.get('/' , async (req, res) => {
       const loadData = await fetchMembers();
       const data = loadData.rows;
       res.json(data);           
   })

问题是您调用 fetchMembers 并等待其中的承诺,但不会阻止代码。请求处理程序的执行继续进行,成员尚未解决。因此,您有两种解决方案,要么在 fetchMembers 和请求处理程序中等待,要么 return 承诺并仅在请求处理程序中等待。就像保罗说的那样,最好导出函数本身。

MemberDB.js 导出调用 fetchMembers() 的结果,这是一个 async 函数,因此总是 return 一个 Promise.

修复

app.get('/' , async (req, res) => {
    res.json(await members)
    console.log('Members: ',JSON.stringify(await members))
})

您是在请求文件而不是等待文件时调用该函数。这有两个作用。首先,您的成员变量将没有数据,其次,由于您根据需要调用它,因此由于所需的缓存,您只会在第一次需要文件时获得数据库中的任何成员。正确的方法是像这样导出函数:

    module.exports = fetchMembers; // note no parentheses 

然后在你的路线中正确调用它:

    const fetchMembers = require(“./dbMembers”);

     app.get(‘/‘, async (req, res) => {
            const members = await fetchMembers();
            res.send(members); // obviously add erro catching and stuff 
    });