मैं अपने लूप के लिए सिंक्रोनस रूप से चलाने के लिए नहीं मिल सका। पंजीकरण का क्रम जो प्रत्येक डोमेन के लिए देता है वह बदल जाता है। मुझे लगता है कि जो भी सबसे तेज़ उत्तर देता है वह उन रिकॉर्ड्स को पहले लाता है। मैं कहाँ गलत कर रहा हूँ?

const rrtypes= ["A","MX","CNAME","NS","TXT"];
var resData = [];
    
export const getAllRecords = async (req,res) => {
    const {domain} = req.params;
         for await(const rrtype of rrtypes){
             dns.resolve (domain, rrtype, (err, records) => { 
             resData.push(rrtype+" "+records);
        });
    }    
        res.send(resData);
        resData = [];      
}
1
aliveli49 25 अगस्त 2021, 01:56

2 जवाब

सबसे बढ़िया उत्तर

ध्यान दें कि आप dns.promises.resolve फ़ंक्शन का उपयोग कर सकते हैं: https://nodejs.org/api /dns.html#dns_dnspromises_resolve_hostname_rrtype

तो आप अपना कोड इसमें बदल देंगे:

const rrtypes = ["A", "MX", "CNAME", "NS", "TXT"];

export const getAllRecords = async (req, res) => {
  const { domain } = req.params;

  // Notice that resData should be local to this function
  let resData = [];
  for (const rrtype of rrtypes) {
    try {
      const records = await dns.promises.resolve(domain, rrtype);
      resData.push(rrtype + " " + records);
      // IMO this would be better: resData.push({ type: rrtype, value: records });
    } catch (err) {
      // Log the error here
    }
  }

  res.send(resData);
};
1
tam.teixeira 25 अगस्त 2021, 23:39

समस्या await के आपके उपयोग में है। await async फ़ंक्शन को कॉल करते समय उपयोग किया जाना चाहिए। फिलहाल आप किसी सरणी से चर को तत्काल करते समय इसका उपयोग कर रहे हैं।

स्लीबेटमैन की एक टिप्पणी के लिए धन्यवाद, मैं यह देखने में सक्षम था कि यह dns.resolve एक वादा वापस नहीं करता है, लेकिन async कॉल को प्रबंधित करने के लिए कॉलबैक का उपयोग करता है। जैसा कि उन्होंने यह भी सुझाव दिया कि हम इन कॉलबैक को प्रबंधित करने का वादा करके इसे ठीक कर सकते हैं।

const rrtypes= ["A","MX","CNAME","NS","TXT"];
var resData = [];

const dnsResolvePromise = (domain, rrtype) => {
  return new Promise((resolve, reject) => {
    dns.resolve(domain, rrtype, (err, records) => { 
        if(err) return reject(err);
        resolve(rrtype+" "+records);
    });
  })
}

export const getAllRecords = async (req,res) => {
    const {domain} = req.params;
    for(const rrtype of rrtypes){
        try{
            const records = await dnsResolvePromise(domain, rrtype);
            resData.push(records);
       } catch (e){
         // Handle error
       }
    }    
    res.send(resData);
    resData = [];      
}

1
Hans Krohn 25 अगस्त 2021, 04:17