异步函数不需要 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
});
我正在尝试使用 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
});