我正在尝试调用简单视图,并在其中使用视图中的数据进行另一个查询。
我的问题是我没有让它工作(这只会给我这样的空对象 [{},{},{},{},{},{},{},{},{},{},{},{},{},{}]
任何想法都会很好
我的代码:
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();
}
})
}
答案 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();
}
}