2017-11-01 10 views
1

約10,000個のCNAMEを解決するプログラムを作成しています。dns.resolveCnameは、解決するCNAMEが大量にある場合に失敗します。

問題は、解決するCNAMEの数が非常に多くなった場合にがError: queryCname ESERVFAILエラーを返すことです。

コードは、次のようになります。

const dns = require('dns') 
dns.setServers(['8.8.8.8']) // provided by google 

let cnames = [....] // length of cnames is 10,000 
let promiseArr = [] 

for (let i = 0; i < cnames.length; i += 1) { 
    let p = new Promise((resolve, reject) => { 
    dns.resolveCname(cnames[i], (err, records) => { 
     if (err) { 
     console.log(err) // this line generates Error: queryCname ESERVFAIL 
     resolve()   // sorry, I forgot adding this line. 
     } else { 
     console.log(records) 
     resolve()   // sorry, I forgot adding this line. 
     } 
    }) 
    }) 
    promiseArr.push(p) 
} 

Promise.all(promiseArr) 
.then(value => { 
    console.log(`Promise.all done`) 
}) 
.catch(err => { 
    console.log(`promise err: ${err}`) 
}) 

それは私があまりにも頻繁にdns.resolveCname()を使用できないことを意味するのでしょうか?

この問題を回避するには、トリガーする頻度を減らすことが可能ですかdns.resolveCname()

この問題を解決する方法はありますか?

私はnode.js v6.2.2を使用しています。

答えて

0

ESERVFAIL - アプリケーションがapi.example.comを照会すると、SERVFAILエラーが返され、呼び出しが失敗します。

Promise.allcatch(実行を停止する)少なくとも1つの非同期関数がエラーをスローしている場合。したがって、この場合Promiseを使用することはできません。10000回の非同期呼び出しでは、悪い習慣です。すべてのメモリを簡単にダンプできます。

問題を解決する1つの方法は、エラーと結果を解決するparallel limited queueを実装し、結果を適切な方法で出力するだけです。

import * as Promise from 'bluebird'; 
import {TaskQueue} from 'cwait'; 

/** Queue allowing 3 concurrent function calls. */ 
var queue = new TaskQueue(Promise, 3); 

Promise.map(list, download); // Download all listed files simultaneously. 

Promise.map(list, queue.wrap(download))); // Download 3 files at a time. 
:私はそれは限られたキューは、そのドキュメントから cwait

で実装した

ワンライブラリー

関連する問題