Node.js 无法从函数返回数据

Node.js 无法从函数返回数据,node.js,reactjs,express,Node.js,Reactjs,Express,在这个基于expressJs的nodejs项目中,我无法从一个函数返回数据 router.get('/', async(req, res) => { const meta = getMeta(); console.log('meta', meta) // this prints the string const reactComp = renderToString(<Index />); res.status(200).render('pages/index'

在这个基于expressJs的nodejs项目中,我无法从一个函数返回数据

 router.get('/', async(req, res) => {
  const meta = getMeta();
  console.log('meta', meta) // this prints the string
  const reactComp = renderToString(<Index />);
  res.status(200).render('pages/index', { reactApp: reactComp, title: meta })
})

function getMeta(){
 console.log("I ran")
 let sql = 'SELECT `title`, `description`, `keyword` FROM `metas` WHERE `url`="-"'
 db.query(sql, (err, rows) => {
    if(err) throw err;
    console.log(rows) // this is printing the data
});
// return rows // this is not working and gives an error
return 'Coming from getMeta'
}

我只想将数据从getMeta函数返回到第一个函数


感谢您的帮助。

如果您使用的是Promissions,您应该从函数内部返回

function getMeta () {

let sql = 'SELECT `title`, `description`, `keyword` FROM `metas` WHERE `url`="-"'

return db.query(sql, (err, rows) => { // <- Add return
  if (err) throw err;
  return rows //  <- Add return
});
}

这里有一些问题,首先,在函数的末尾,您希望返回行。没有定义行,因为它们只存在于sql回调的作用域中

接下来的事情是,即使定义了rows变量,在返回的那一刻,sql还没有返回数据,因此您将返回一些空变量

这个回调的原因是能够等待sql返回数据,一旦sql有了行,就可以在回调中使用它们

最基本的实现如下所示:

router.get'/',asyncreq,res=>{ 常量sql='从'metas'中选择'title','description','keyword',其中'url'=-' db.querysql,err,rows=>{ 投球失误; const reactComp=renderToString; res.status200.render'pages/index',{reactApp:reactComp,title:rows} }; } 你看,我们正在等待数据到达回调内部并从那里返回我们的响应

现在,可能有一些奇特的方法可以用承诺或其他东西来包装这一点:

函数getMeta{ 常量sql='从'metas'中选择'title','description','keyword',其中'url'=-' //用承诺包装查询 返回新的PromiseSolve,拒绝=>{ db.querysql,err,rows=>{ IFER rejecterr; 解析行 }; } } //现在我们可以使用wait关键字 router.get'/',asyncreq,res=>{ const meta=等待getMeta console.log'meta',meta const reactComp=renderToString res.status200.render'pages/index',{reactApp:reactComp,title:meta} }
使用promise for mysql,在回调函数中不能使用return

function getMeta () {

let sql = 'SELECT `title`, `description`, `keyword` FROM `metas` WHERE `url`="-"'

return db.query(sql, (err, rows) => { // <- Add return
  if (err) throw err;
  return rows //  <- Add return
});
}
试试这个:


function getMeta(){
    return new Promise(resolve => {
      console.log("I ran")
      let sql = 'SELECT `title`, `description`, `keyword` FROM `metas` WHERE `url`="-"'
      db.query(sql, (err, rows) => {
        if(err) throw err;
        console.log(rows) // this is printing the data
        resolve(rows) //this will make the return
     });
});


作为nodejs,这将返回整个查询本身。我只想返回行数据。它不起作用。