您可以像@Barmar 建议的那样使用Promise.All,或者如果您想按顺序进行dns 查找,您可以这样做,请注意dns.promises.resolve 的使用,它返回一个承诺而不是回调,以及使用async/await。我将其作为脚本进行了测试,因此我还将调用的输出置于getAllRecords({ params: { domain: "gmail.com" } });
import dns from "dns";
const rrtype = "*";
const obj = ["A", "MX", "CNAME", "NS", "TXT"];
export const getAllRecords = async (req, res) => {
const { domain } = req.params;
let myObj = [];
for (let i = 0; i < obj.length; i++) {
try {
const res = await dns.promises.resolve(domain, obj[i]);
myObj.push({ recordType: obj[i], recordValue: res });
} catch (err) {
console.log(err);
}
}
// Debug results
console.log(JSON.stringify(myObj, null, 4));
setTimeout(() => {
// res.send(myObj);
console.log(" === END ===");
}, 1000);
};
// Simple test
getAllRecords({ params: { domain: "gmail.com" } });
输出:
> node dnsTest.js
Error calling resolve Error: queryCname ENODATA gmail.com
at QueryReqWrap.onresolve [as oncomplete] (internal/dns/promises.js:170:17) {
errno: 'ENODATA',
code: 'ENODATA',
syscall: 'queryCname',
hostname: 'gmail.com'
}
[
{
"recordType": "A",
"recordValue": [
"142.250.184.5"
]
},
{
"recordType": "MX",
"recordValue": [
{
"exchange": "alt4.gmail-smtp-in.l.google.com",
"priority": 40
},
{
"exchange": "alt2.gmail-smtp-in.l.google.com",
"priority": 20
},
{
"exchange": "alt3.gmail-smtp-in.l.google.com",
"priority": 30
},
{
"exchange": "gmail-smtp-in.l.google.com",
"priority": 5
},
{
"exchange": "alt1.gmail-smtp-in.l.google.com",
"priority": 10
}
]
},
{
"recordType": "NS",
"recordValue": [
"ns1.google.com",
"ns3.google.com",
"ns2.google.com",
"ns4.google.com"
]
},
{
"recordType": "TXT",
"recordValue": [
[
"globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8="
],
[
"v=spf1 redirect=_spf.google.com"
]
]
}
]
=== END ===