【发布时间】:2017-12-26 00:01:30
【问题描述】:
我有一个非常简单的 Hapi 服务器,它返回一个 Promise,当解析调用 reply() 时,我从它的文档中了解到这是可能的:https://hapijs.com/api#route-handler
问题是 Promise 似乎没有得到解决(因此我没有收到响应),直到我刷新页面几次或经过很长时间之后。 check_ips 返回的承诺按预期工作,因此它似乎与 Hapi 如何处理它有关。
const Hapi = require('hapi');
const ping = require('net-ping')
const server = new Hapi.Server({ debug: { request: ['error'] } });
const port = process.env.PORT || 8080;
server.connection({ port: port, host: 'localhost' });
const session = ping.createSession();
check_ips = function(ips) {
var pings = []
for (var i = 0; i < ips.length; i++) {
pings.push(new Promise(function(fulfill, reject) {
session.pingHost(ips[i], function(err, target) {
if (err) {
if (err instanceof ping.RequestTimedOutError)
fulfill(false)
else
reject(err)
} else {
fulfill(true)
}
})
}))
}
return Promise.all(pings).then(function(results) {
response = {}
for (var i = 0; i < ips.length; i++) {
response[ips[i]] = results[i]
}
return(JSON.stringify(response))
})
}
server.route({
method: 'GET',
path: '/check_ips/{ips}',
handler: function(req, reply) {
if (!req.params["ips"]) {
return reply({"error": "No IPs received"})
}
ips = req.params["ips"].split(",")
return check_ips(ips).then(reply)
}
});
server.start(function(err) {
if (err) {
throw err;
}
console.log(`Server running at: ${server.info.uri}`);
});
【问题讨论】:
-
这似乎在我的机器上运行良好。请问你用的是什么IP?你有什么版本的Hapi?作为旁注,请注意,当您声明
response = {}和ips = req.params["ips"].split(",")时,您正在污染全局命名空间。在每种情况下,这些项目都可以声明为const。你也可以说const check_ips = function(ips) {...。 -
这很奇怪。例如,我一直在尝试 8.8.8.8 和 8.8.4.4。我正在使用 hapi v16.4.3。感谢旁注。我一直没有注意这一点,但很高兴知道。