javascript - Hapi 处理程序方法没有返回值
问题描述
我正在尝试将 hapi.js 与 mysql 连接。但是在定义 server.route 时。没有handler
返回值。
server.route({
method:'GET',
path:'/hello',
handler:function(request,h) {
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
return ('The solution is: ', results[0].solution)
});
}
});
它在说Error: handler method did not return a value, a promise, or throw an error
。
在这里,我要回来('The solution is: ', results[0].solution)
但它仍然无法正常工作。
控制台中的输出是,The solution is: 2
但在浏览器中,这是一个错误。
请帮忙。谢谢
解决方案
从 Hapi v17 开始,所有路由处理程序都应该显式地返回一些东西。
正如您在错误中看到的那样,您没有返回任何值,因为您在异步函数的回调中返回了一些不在主处理函数中的内容。
您有几个选项来处理这个问题,第一个是将您的路由处理程序转换为async
并await
用于异步函数,如下所示:
handler: async function (request, h) => {
const result = await connection.query('SELECT 1 + 1 AS solution')
return result // do something with sql result then return it;
}
注意:这仅在您connection.query
返回 Promise 而不是 NodeJS 回调样式时才有效。如果没有,您可以查看utils.promisify
将带有回调的函数转换为 Promise 或手动将您的函数包装在 a 中new Promise
。
但是,如果您不想或不能使用 await/async,您仍然可以将带有回调的函数转换为 Promise,然后返回 Promise,但这会导致大量的 then 链接。
const { promisify } = require('util');
[...]
handler: function (request, h) {
const query = promisify(connection.query);
return query('SELECT fancy SQL')
.then(result => {
// do something with sql result
return result
})
}
您的路线的返回值将是 last 的最后一个返回值.then
。
推荐阅读
- c# - WPF ListView - 在未单击所选项目时检测 ListVewItem
- kdb - KDB+/Q:填充不规则列表的有效方法(矩阵)
- html - 如何在导航栏后面制作横幅文本
- php - 如何在我的第一个循环中有第二个循环
- python - 使用 pip 安装 email_validator
- python - 通过 python 与 Fluke 耐久高温计 (profinet/RS485) 通信
- git - Git squash 提交以通过 zip 文件减少空间
- javascript - 任何使用 Python 自动化桌面 GUI 的方法,就像使用 JavaScript 自动化 Web 表单一样?
- mvvm - 更改 LiveData 后如何更新 RecyclerView 适配器?
- python-3.x - 'NoneType' 和 'int' 的实例之间不支持 '<'