异步函数内部的异步错误

时间:2021-02-04 19:16:53

标签: node.js reactjs express next.js

我正在尝试调用简单视图,并在其中使用视图中的数据进行另一个查询。

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

任何想法都会很好

我的代码:

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();
        }
    })
} 

1 个答案:

答案 0 :(得分:1)

您需要等待任何异步操作,并且由于 rows.map 被赋予了一个异步函数,它返回了一个承诺数组,您必须使用 Promise.all

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()
  try {
    // wrap the callback function in a promise
    const rows:any = await new Promise((resolve, reject) => connection.query("SELECT * FROM view3", async (err: any, rows: Song[], _fields: any) => {
      if (err) {
        return reject(err);     
      }
      resolve(rows);
    }));
    const getIp = async(id: string) =>{
      // convert the callback function to promise style syntax
      return new Promise((resolve, reject) => {
        connection.query(`SELECT * FROM user WHERE ((ip = 12.12.142.91) AND (item = ${id}))`,(err:any, rows:any, _fields:any) => {
          if(err){
            return reject(err);
          }
          return resolve(rows);
        })
      });
    }
    const response = await Promise.all(rows.map(async(row:Song) => {
        return { voted: await getIp(row.id), id: row.id, vote: row.votes };
    }));
    res.status(200).json(response)
    connection.destroy();
  } catch (err) {
    console.log(err)
    res.json({err: err})
    connection.destroy();
  }
}