Node.js DNS 查找范围错误? (POST 请求)

Node.js DNS Lookup scope error? (POST request)

我正在使用 Node.js 和 Express.js 框架进行 DNS 查找 API,这样当它发送 POST 请求时,它应该 return不同记录类型的地址。

app.post('/', (req, res) => {
  // Request format
  // const l = {
  //   lookup: 'twitter.com',
  //   recordTypes: ['A', 'TXT']
  // };

  // Using destructor to fetch properties
  const { lookup, recordTypes } = req.body;
  console.log(lookup, recordTypes);

  // For each record type
  recordTypes.forEach(function(type) {
    // setTimeout to get something async
    setTimeout(function() {
      dns.resolve(lookup.toLowerCase(), type, (err, addresses) => {
        console.log(type);
        if (err) {
          return console.log(`\nType(${type}):\n`, err);
        }
        result = result + JSON.stringify({ type: `${type}`, response: { addresses } });
        console.log(result);
      });
    }, 2000);
  });
  res.send(result);
});

它在控制台中记录了正确的内容,但是当涉及到响应时,它 return 是一个空字符串。我使用 setTimeout 来模拟请求的异步性质,但它不起作用。

请假设我已经声明了结果等内容,因为它正在运行。另外,请不要将我重定向到 Node.js 文档,因为我已经阅读了那些内容,这不是这里的问题。问题是我需要获取数组中的每个记录类型并将其作为响应发回。

这是我尝试过的方法:

请帮忙!

我阅读您的代码的方式是,对于数组中的每个项目,您都正确地使用回调来完成每个单独的处理。

但是,请记住 forEach 本身不是异步的。因此,您正在设置一堆将在某个时间完成的任务,然后返回 undefined... 然后您的结果开始逐渐出现。

有几种正确的方法。当您在这里使用回调时,我将使用该样式。当数组中的所有项目都已完全处理时,您希望获得回调。 async module 在这方面做得很好,提供了很多作用于数组等的高质量方法,并为您提供了一种在它们全部结束时进行回调的方法。

您的函数将类似于:

 let res = []

 async.each( recordTypes,
    ( type, done ) => {
      dns.resolve(lookup.toLowerCase(), type, (err, addresses) => {
        result = result + JSON.stringify({ type: `${type}`, response: { addresses } });
        done(err)
      } )
    },
    (allOverError) => {
      res.send(result);
    }
)

注意这里有两个函数参数:第一个为列表中的每一项调用,最后一个在列表中的每一项都被完全处理时调用。

还有其他方法,promises 或 async/await 关键字(由于异步模块的名称而混淆),但回调很好。