Node.js 无法从函数返回数据
在这个基于expressJs的nodejs项目中,我无法从一个函数返回数据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'
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,这将返回整个查询本身。我只想返回行数据。它不起作用。