Node.js 异步函数中的异步错误

Node.js 异步函数中的异步错误,node.js,reactjs,express,next.js,Node.js,Reactjs,Express,Next.js,我试图调用simple view,并在其中使用视图中的数据进行另一个查询 我的问题是我不能让它工作(这只会给我像这样的空对象[{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}] 有什么好主意吗 我的代码: import { NextApiRequest, NextApiResponse } from 'next'; import { getConnection } from '../../../database/connection'; import {

我试图调用simple view,并在其中使用视图中的数据进行另一个查询

我的问题是我不能让它工作(这只会给我像这样的空对象
[{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}]

有什么好主意吗

我的代码:

import { NextApiRequest, NextApiResponse } from 'next';
import { getConnection } from '../../../database/connection';
import { Song, Songs } from '../../../utils/song';

export default async function getPeople(req: NextApiRequest, res: NextApiResponse) {
    const connection = getConnection()
    connection.query("SELECT * FROM view3", (err: any, rows: Song[], _fields: any) => {
        if (err) {
            console.log(err)
            res.json({err: err})
            connection.destroy();
        } else {
            const response = rows.map( async(row:Song) => {
                const getIp = async() =>{
                    connection.query(`SELECT * FROM user WHERE ((ip = 12.12.142.91}) AND (item = ${row.id}))`,(err:any, rows:any, _fields:any) => {
                        if(err){
                            console.log(err)
                        }
                        else{
                            console.log(rows)
                            return rows;
                        }
                    })
                }
                

                return { voted: getIp(), id: row.id, vote: row.votes,}
            })
             res.status(200).json(response)
            connection.destroy();
        }
    })
} 

您需要等待任何异步操作,因为
rows.map
提供了一个异步函数,它将返回一个承诺数组,您必须使用
Promise.all

从“下一步”导入{NextApiRequest,nextapireresponse};
从“../../../database/connection”导入{getConnection};
从“../../../utils/Song”导入{Song,Songs};
导出默认异步函数getPeople(请求:NextApiRequest,回复:nextapireResponse){
const connection=getConnection()
试一试{
//用承诺包装回调函数
const rows:any=等待新承诺((解析、拒绝)=>connection.query(“从视图3中选择*”),异步(err:any,rows:Song[],_fields:any)=>{
如果(错误){
退货拒绝(err);
}
解析(行);
}));
const getIp=async(id:string)=>{
//将回调函数转换为promise样式语法
返回新承诺((解决、拒绝)=>{
connection.query(`SELECT*fromsuserwhere((ip=12.12.142.91)和(item=${id}))`,(err:any,rows:any,_fields:any)=>{
如果(错误){
退货拒绝(err);
}
返回解析(行);
})
});
}
const response=wait Promise.all(rows.map)(异步(row:Song)=>{
return{vote:await getIp(row.id),id:row.id,vote:row.voces};
}));
res.status(200).json(响应)
connection.destroy();
}捕捉(错误){
console.log(错误)
res.json({err:err})
connection.destroy();
}
}

奇怪的是,当getIp中的loggin从未到达console.log(行)时,对象的投票部分从未显示。甚至在等待承诺中登录。所有这些都是未定义的。你知道我在发布答案时遗漏了一个问题吗。我更新了一些重构,以确保回调得到批准。谢谢你,似乎你在getIp函数的结尾有语法错误。我似乎没有找到它的修复方法,直到得到','预期。at const getIp=async(id:string)=>{@MaximeGhéraille我想我也抓到了,但是你用的是什么编辑器?你能修复语法错误吗?我没有在项目中打开这个,只是使用stackoverflow编辑器,所以可能会出现一些小的拼写错误,但我想你应该能够修复它们。我不是给你100%的工作代码,只是告诉你如何重组来修复你的async问题。你不能简单地将
async
放在一个函数上,让它像一个承诺一样。连接查询函数有一个回调,这意味着你需要将这些调用封装在承诺中,并相应地解决/拒绝。@xdumain phix不是downvoter,我只是发现你的问题很不清楚。是什么给了你这个输出?结果如何你期望的是什么?为什么getPeople是异步的?这个函数是如何使用的?