我正在尝试将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
,但在浏览器中为错误。
请帮助。谢谢
答案 0 :(得分:2)
从Hapi v17开始,所有路由处理程序都应显式返回某些内容。
您会在错误中看到,您不返回任何值,因为您在异步函数的回调中返回了某些内容,而该回调不在主处理函数中。
您可以通过多种方法来处理此问题,第一个方法是将路由处理程序转换为async
并使用await
来实现异步功能,例如:
handler: async function (request, h) => {
await connection.query('SELECT 1 + 1 AS solution')
}
注意:仅当您的connection.query
可以返回Promise而不是NodeJS回调样式时,此方法才有效。如果不是这样,您可以查看utils.promisify
来将带有回调的函数转换为Promise或通过将函数自动包装在new Promise
中来手动进行。
但是,如果您不希望或不能使用await / async,您仍然可以将带有回调的函数转换为Promise,然后返回Promise,但这会导致很多随后的链接。
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
})
}
您的路线的返回值将是最后一个.then
的最后一个返回值。
答案 1 :(得分:0)
尝试使用异步/等待
server.route({
method: 'GET',
path: '/hello',
handler: async function (request, h) {
try {
const { credentials, artifacts } = await request.server.auth.test('default', request);
return { status: true, user: credentials.name };
}
catch (err) {
return { status: false };
}
}
});
答案 2 :(得分:0)
我通过将回调转换为Promise解决了这个问题。
handler: (request, h) => {
return new Promise ((resolve, reject)=> {
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
let solution = 'The solution is: ' + results[0].solution
let view = () => {
return h.view('landing-page', {solution: solution});
}
return resolve(view())
});
})
}
我的问题不是特定于hapi或mysql,而是我的JavaScript技能。