Node.js 返回的数组具有未定义的值
我正在尝试通过异步/等待返回数组:Node.js 返回的数组具有未定义的值,node.js,express,async-await,Node.js,Express,Async Await,我正在尝试通过异步/等待返回数组: app.get('/users/article/feed',checkAuthenticated,async (request,response)=>{ try{ function executor(){ let articleArray=[] const sql="SELECT noOfArticles FROM Artic
app.get('/users/article/feed',checkAuthenticated,async (request,response)=>{
try{
function executor(){
let articleArray=[]
const sql="SELECT noOfArticles FROM Articles WHERE id=?"
db.query(sql,[request.user.id], (err,result)=>{
if(err) throw err
let noOfArticles=result[0].noOfArticles
for(let i=1;i<=noOfArticles;i++){
const sql1="SELECT ?? FROM Articles WHERE id=?"
let index='article'+i
db.query(sql1,[index,request.user.id],(err,result)=>{
if(err) throw err
articleArray.push(result[0][index])
if(articleArray.length===noOfArticles){
console.log(articleArray); //here the array is printed as expected
return articleArray;
}
})
}
})
}
const resultArray= await executor();
console.log(resultArray); //here the array is undefined
response.render('viewArticles');
} catch(e){
console.log(e);
}
})
app.get('/users/article/feed',checkAuthenticated,异步(请求,响应)=>{
试一试{
函数执行器(){
让articleArray=[]
const sql=“从id=?”的文章中选择noOfArticles”
db.query(sql,[request.user.id],(err,result)=>{
如果(错误)抛出错误
设noOfArticles=结果[0]。noOfArticles
for(设i=1;i{
如果(错误)抛出错误
articleArray.push(结果[0][index])
if(articleArray.length==noofarticle){
console.log(articleArray);//此处按预期打印数组
返回数组;
}
})
}
})
}
const resultaray=等待执行器();
console.log(resultArray);//此处数组未定义
响应。呈现(“viewArticles”);
}捕获(e){
控制台日志(e);
}
})
resultArray始终未定义。
我知道这是一个很老的问题。我尝试在Stack Overflow中检查所有其他答案,但对此我感到非常困惑。我是js的新手,所以我无法正确理解它。如何解决此问题?如果将调用的函数设为异步,是否会返回一些结果
async function executor(){
let articleArray=[]
const sql="SELECT noOfArticles FROM Articles WHERE id=?"
db.query(sql,[request.user.id], (err,result)=>{
if(err) throw err
let noOfArticles=result[0].noOfArticles
for(let i=1;i<=noOfArticles;i++){
const sql1="SELECT ?? FROM Articles WHERE id=?"
let index='article'+i
db.query(sql1,[index,request.user.id],(err,result)=>{
if(err) throw err
articleArray.push(result[0][index])
if(articleArray.length===noOfArticles){
console.log(articleArray); //here the array is printed as expected
return articleArray;
}
})
}
})
}
异步函数执行器(){
让articleArray=[]
const sql=“从id=?”的文章中选择noOfArticles”
db.query(sql,[request.user.id],(err,result)=>{
如果(错误)抛出错误
设noOfArticles=结果[0]。noOfArticles
for(设i=1;i{
如果(错误)抛出错误
articleArray.push(结果[0][index])
if(articleArray.length==noofarticle){
console.log(articleArray);//此处按预期打印数组
返回数组;
}
})
}
})
}
如果将调用的函数设为异步,是否会返回一些结果
async function executor(){
let articleArray=[]
const sql="SELECT noOfArticles FROM Articles WHERE id=?"
db.query(sql,[request.user.id], (err,result)=>{
if(err) throw err
let noOfArticles=result[0].noOfArticles
for(let i=1;i<=noOfArticles;i++){
const sql1="SELECT ?? FROM Articles WHERE id=?"
let index='article'+i
db.query(sql1,[index,request.user.id],(err,result)=>{
if(err) throw err
articleArray.push(result[0][index])
if(articleArray.length===noOfArticles){
console.log(articleArray); //here the array is printed as expected
return articleArray;
}
})
}
})
}
异步函数执行器(){
让articleArray=[]
const sql=“从id=?”的文章中选择noOfArticles”
db.query(sql,[request.user.id],(err,result)=>{
如果(错误)抛出错误
设noOfArticles=结果[0]。noOfArticles
for(设i=1;i{
如果(错误)抛出错误
articleArray.push(结果[0][index])
if(articleArray.length==noofarticle){
console.log(articleArray);//此处按预期打印数组
返回数组;
}
})
}
})
}
您正在从回调函数内部返回,因为执行器不会等待您的查询响应,因此回调函数将不起作用。相反,你要回报一个承诺
函数执行器(){
返回新承诺((解决、拒绝)=>{
让articleArray=[];
const sql=“从id=?”的文章中选择noOfArticles”;
db.query(sql,[request.user.id],(err,result)=>{
如果(错误)返回拒绝(错误);
设noOfArticles=结果[0]。noOfArticles;
for(设i=1;i{
如果(错误)返回拒绝(错误);
articleArray.push(结果[0][index]);
if(articleArray.length==noofarticle){
console.log(articleArray);//此处按预期打印数组
返回解析(articleArray);
}
});
}
});
})
}
您正在从回调函数内部返回,因为执行器不会等待您的查询响应,因此回调函数将不起作用。相反,你要回报一个承诺
函数执行器(){
返回新承诺((解决、拒绝)=>{
让articleArray=[];
const sql=“从id=?”的文章中选择noOfArticles”;
db.query(sql,[request.user.id],(err,result)=>{
如果(错误)返回拒绝(错误);
设noOfArticles=结果[0]。noOfArticles;
for(设i=1;i{
如果(错误)返回拒绝(错误);
articleArray.push(结果[0][index]);
if(articleArray.length==noofarticle){
console.log(articleArray);//此处按预期打印数组
返回解析(articleArray);
}
});
}
});
})
}
返回articleArray时,并不是从executor函数返回它。而是从传入db.query函数的回调返回它。()=>{}
语法基本上是function(){}
的简写(尽管有一些差异超出了这个答案的范围)
也许这样做会有所帮助(请注意,我删除了try-catch,因为我认为应该在express中的中间件级别完成此类日志记录,您似乎正在使用它):
app.get('/users/article/feed',checkAuthenticated,异步(请求,响应)=>{
返回新承诺((解决、拒绝)=>{
让articleArray=[]
const sql=“从id=?”的文章中选择noOfArticles”
db.query(sql,[request.user.id],(err,result)=>{
如果(错误)拒绝(错误)
设noOfArticles=结果[0]。noOfArticles
for(设i=1;i{
如果(错误)拒绝(错误);//如果有错误,拒绝承诺
articleArray.push(结果[0][index])
if(articleArray.length==noofarticle){
log(articleArray);
决议