我正在使用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文档,因为我已经阅读了这些东西,而这不是这里的问题。问题是我需要获取数组中的每种记录类型,并将其作为响应发送回去。
这是我尝试过的:
请帮助!
答案 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模块的名称而令人困惑),但是回调是好的。