Hapi 处理程序方法未返回值
Hapi handler method is not returning a value
我正在尝试将 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
,但是在浏览器中,是错误的。
请帮忙。谢谢
尝试使用 async/await
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 };
}
}
});
我通过将回调转换为 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 方面的技能。
自 Hapi v17 起,所有路由处理程序都应明确 return 某些内容。
正如您在错误中看到的那样,您没有 return 任何值,因为您 return 异步函数回调中的某些内容不在主处理程序函数中。
你有几种选择来处理这个问题,第一个是将你的路由处理程序转换为 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
return Promise 而不是 NodeJS 回调样式时有效。如果没有,您可以查看 utils.promisify
将带有回调的函数转换为 Promise 或手动将您的函数包装在 new Promise
中。
但是,如果您不想或不能使用 await/async,您仍然可以将带有回调的函数转换为 Promise,然后 return 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
})
}
您的路线的 return 值将是最后 .then
的最后 return 值。
我正在尝试将 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
,但是在浏览器中,是错误的。
请帮忙。谢谢
尝试使用 async/await
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 };
}
}
});
我通过将回调转换为 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 方面的技能。
自 Hapi v17 起,所有路由处理程序都应明确 return 某些内容。
正如您在错误中看到的那样,您没有 return 任何值,因为您 return 异步函数回调中的某些内容不在主处理程序函数中。
你有几种选择来处理这个问题,第一个是将你的路由处理程序转换为 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
return Promise 而不是 NodeJS 回调样式时有效。如果没有,您可以查看 utils.promisify
将带有回调的函数转换为 Promise 或手动将您的函数包装在 new Promise
中。
但是,如果您不想或不能使用 await/async,您仍然可以将带有回调的函数转换为 Promise,然后 return 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
})
}
您的路线的 return 值将是最后 .then
的最后 return 值。