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);
决议