在这个基于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函数返回到第一个。
感谢您的帮助。
答案 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 })
})