Nodejs函数returns未定义,虽然回调参数有值
Nodejs function returns undefined, although callback parameter has a value
我有以下代码:
const get = (ip,key) => {
mysql.query(`SELECT content FROM sessions WHERE ip = "${ip}" AND name = "${key}" ORDER BY id DESC LIMIT 1`,(err,result) => {
if(err) throw err
console.log('Callback:',result[0].content)
return result[0].content
})
}
console.log('Return:',get('10.0.0.9','test'))
它产生以下输出:
Return: undefined
Callback: test content
为什么我的函数 return 什么都没有?
值 "test content" 实际上是由您传递给 mysql.query()
的处理程序(或回调)编辑的 return。
你的函数 get 实际上没有 return 任何东西。
您正在处理一个异步函数。
有几种方法可以解决您的问题。
最简单的方法是将第三个参数传递给您的 get 函数,一个回调函数,然后在您的 mysql 处理程序中调用它。类似于:
const get = (ip,key,callback) => {
mysql.query(`SELECT content FROM sessions WHERE ip = "${ip}" AND name = "${key}" ORDER BY id DESC LIMIT 1`,(err,result) => {
if(err) throw err
console.log('Callback:',result[0].content);
// Call you custom callback here to forward result
callback( result[0].content );
})
}
get('10.0.0.9','test', (result) => console.log('Return:', result));
另一种更现代的方法是使用 Promise
最 'up to date' 的解决方案是使用 async/await
我有以下代码:
const get = (ip,key) => {
mysql.query(`SELECT content FROM sessions WHERE ip = "${ip}" AND name = "${key}" ORDER BY id DESC LIMIT 1`,(err,result) => {
if(err) throw err
console.log('Callback:',result[0].content)
return result[0].content
})
}
console.log('Return:',get('10.0.0.9','test'))
它产生以下输出:
Return: undefined
Callback: test content
为什么我的函数 return 什么都没有?
值 "test content" 实际上是由您传递给 mysql.query()
的处理程序(或回调)编辑的 return。
你的函数 get 实际上没有 return 任何东西。
您正在处理一个异步函数。 有几种方法可以解决您的问题。
最简单的方法是将第三个参数传递给您的 get 函数,一个回调函数,然后在您的 mysql 处理程序中调用它。类似于:
const get = (ip,key,callback) => {
mysql.query(`SELECT content FROM sessions WHERE ip = "${ip}" AND name = "${key}" ORDER BY id DESC LIMIT 1`,(err,result) => {
if(err) throw err
console.log('Callback:',result[0].content);
// Call you custom callback here to forward result
callback( result[0].content );
})
}
get('10.0.0.9','test', (result) => console.log('Return:', result));
另一种更现代的方法是使用 Promise
最 'up to date' 的解决方案是使用 async/await