首页 > 解决方案 > 无法理解异步/等待

问题描述

我认为的简单例子。我想根据请求使用 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可以完成查找之前将响应发回,但我希望该查找完成然后返回响应。

标签: node.jsasync-awaitreverse-dns

解决方案


你正在混合callbackasync/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
  }
}

推荐阅读