node.js - 无法理解异步/等待
问题描述
我认为的简单例子。我想根据请求使用 Express 返回用户 IP 和主机名。但是从 IP 解析该主机名给我带来了一些麻烦。
router.get('/', (req, res) => {
logRequest(req, res);
});
async function logRequest(req, res) {
res.send({
ip: req.ip,
hostname: await getRemoteHostName(req.ip)
});
}
async function getRemoteHostName(ip) {
await require('dns').reverse(ip, (err, domains) => {
if (err) { handleError(err); return; }
return domains.map(s => s.toLowerCase());
});
}
{ip: 192.168.10.100}
当我期望我也应该取回我的主机名时,我得到的只是我的 IP 。如果我console.log
是我的主机名,它会打印到控制台,但主机名不会在响应中通过 express 发回。我究竟做错了什么?我觉得 express 在dns.reverse
可以完成查找之前将响应发回,但我希望该查找完成然后返回响应。
解决方案
你正在混合callback
和async/await
await
应该结合一个Promise
在您的情况下dns.reverse
,这不是一个承诺,也没有回报。
首先,你需要使用dns promise
然后您需要更新getRemoteHostName
以返回主机名并处理错误
const { Resolver } = require('dns').promises;
const resolver = new Resolver();
async function getRemoteHostName(ip) {
try {
const hostnames = await resolver.reverse(ip)
// your logic here
return hostnames
} catch(error) {
// handle error here
}
}
推荐阅读
- mysql - 获取联合表连接信息
- c# - Linq 除了使用自定义比较器返回整个第一组
- mysql - 尝试将列的平均值与列的每个值进行比较-不使用嵌套或子查询
- android - 使用额外属性时进行 gradleDependency 检查
- google-api - 如何在不使用 oauth2 的情况下使用电子表格 API 读取数据
- c# - 安装 Microsoft.AspnetCore.Authentication.AzureADB2C.UI 后无法加载 Microsoft.AspNetCore.Razor.Runtime
- python - 如何使用 OpenCV 获得金属光泽物体的轮廓
- javascript - 多个下拉菜单按钮 - 仅打开单击按钮
- android - 使用 Android Studio,如何在 Datepicker 中显示选定日期的日期(星期一、星期二、星期三等)、日期、月份和年份
- vue.js - 无法构建 Gridsome 项目:模式导致“未定义窗口”错误