无法从函数返回数据

时间:2020-05-04 13:32:19

标签: 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', { 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函数返回到第一个。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

对MySQL使用Promise,您不能在回调函数中使用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
     });
});

答案 1 :(得分:0)

如果使用诺言,则应从函数内部返回。

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() {

(async () => {
  let sql = 'SELECT `title`, `description`, `keyword` FROM `metas` WHERE `url`="-"'

  try {
    const result = await await db.query(sql)
    if (!result) throw Error

    return result

  } catch (err) {
    // handle error
  }

 })()
}

答案 2 :(得分:0)

那里有一些问题,首先,您要返回行的函数结尾。没有定义行,因为它们仅存在于sql回调的范围内。

接下来的事情是,即使定义了行变量,返回的那一刻,sql仍未返回数据,因此您将返回一些空变量。

此回调存在的原因是能够等待sql返回数据,并且一旦sql具有行,就可以在回调内部使用它们。

最基本的实现如下所示:

 router.get('/', async(req, res) => {
   const sql = 'SELECT `title`, `description`, `keyword` FROM `metas` WHERE `url`="-"'  
   db.query(sql, (err, rows) => {
     if(err) throw err;
     const reactComp = renderToString(<Index />);
     res.status(200).render('pages/index', { reactApp: reactComp, title: rows })
   });
})

您知道,我们正在等待数据到达回调内部并从那里返回我们的响应。

现在,可能有一些花哨的方法可以将其包装在promise之类的东西中:

function getMeta() {
    const sql = 'SELECT `title`, `description`, `keyword` FROM `metas` WHERE `url`="-"'  
   // wrapping the query in a promise
   return new Promise((resolve, reject) => {
    db.query(sql, (err, rows) => {
      if(err) reject(err);
      resolve(rows)
    });
  })
}

// now we can use the await keyword
router.get('/', async(req, res) => {
  const meta = await getMeta()
  console.log('meta', meta)
  const reactComp = renderToString(<Index />)
  res.status(200).render('pages/index', { reactApp: reactComp, title: meta })
})