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

时间:2018-08-07 22:41:38

标签: node.js express post dns response

我正在使用Node.js和Express.js框架制作DNS查找API,以便当它发送POST请求时,它应该返回不同记录类型的地址。

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);
});

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

请假设我已经声明了诸如result等之类的内容,因为它可以正常工作。另外,请不要将我重定向到Node.js文档,因为我已经阅读了这些东西,而这不是这里的问题。问题是我需要获取数组中的每种记录类型,并将其作为响应发送回去。

这是我尝试过的:

  • 试图为结果数组中的每种记录类型推送响应,
  • 试图使用for循环而不是forEach

请帮助!

1 个答案:

答案 0 :(得分:0)

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

但是,请记住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);
    }
)

请注意,这里有两个函数参数:对于列表中的每个项目都调用第一个参数,而对列表中的每个项目都进行了完全处理后,则调用最后一个参数。

promise或async / await关键字也有其他方法(由于async模块的名称而令人困惑),但是回调是好的。