2017-05-07 18 views
2

私はnode.jsでこの問題を抱えています。アプリケーションを起動するときに--trace-sync-ioというノードを使用しています。リクエストモジュールとrequest-promiseモジュールを使用してserver.jsファイルでapiを呼び出すと、私はSync APIを使用していると警告し、私のrequest.promiseコールの開始点を指しています。私は、コマンドnode --trace-sync-io server.jsでノードを起動するときNode.jsでasync apiを呼び出す方法は?

var request = require("request"); 
var rp = require("request-promise"); 

var options = { 
    uri: url, 
    json: true 
}; 

rp(options).then(function (data){ 
    //then I do something with data here 
}.catch(function(err){ 
    //catch errors here 
}) 

は、だから私はWARNING: Detected use of sync APIとスタックトレースを取得私は、コールRPを開始する行を指す

(node:17212) WARNING: Detected use of sync API 
at rng (mypath\node_modules\uuid\lib\rng.js:7:10) 
at v4 (mypath\node_modules\uuid\v4.js:13:52) 
at Multipart (mypath\node_modules\request\lib\multipart.js:11:19) 
at Request (mypath\node_modules\request\request.js:127:21) 
at request (mypath\node_modules\request\index.js:54:10) 
at mypath\server.js:333:8 
at emitOne (events.js:96:13) 
at emit (events.js:188:7) 
at Query.handleReadyForQuery (mypath\node_modules\pg\lib\query.js:126:8) 

(options.then(機能(データ)))

+0

[crypto.randomBytes]の同期バージョンを呼び出す[this function](https://github.com/kelektiv/node-uuid/blob/3b218806aa82e76c7aaa6c9ad62e4d5abe2de4e3/lib/rng.js#L6-L8)を指します。 '。 'request'と' uuid'にパッチを当てずに修正することはできませんが、実際の問題は何もわかりません。 – robertklep

+0

@robertklepなぜリクエストモジュールがそのようなものを呼び出すのですか?私が考える問題は、sync apiを使用しているときにサーバが何も処理できないため、node.jsでsync apiを使用するとサイト全体が遅くなることが読み取れるということです。しかし、私はこの特定のものがどんな種類の影響を持っているのか分かりません。 – Quartal

+0

'request'はマルチパートリクエストにUUIDを使用します(UUIDはセパレータとして使用されます)。マルチパートデータを投稿していなくても明らかです。しかし、それは大したことではない、私のラップトップは約300K UUIDv4秒を生成することができるので、それぞれ約3.3マイクロ秒かかる。それは目立つようにはなりません。 – robertklep

答えて

1

(マルチセパレータを生成するために内部requestによって使用される)uuidthe following functionパッケージ内にスタックトレースポイントは:

var rb = require('crypto').randomBytes; 

function rng() { 
    return rb(16); 
}; 

crypto.randomBytes()はここでは同期的に呼び出されるため、警告が表示されます。

ただし、必ずしもこのコードがイベントループをブロックして大きな問題を引き起こすとは限りません。確かに、それは同期的なので、ブロッキングだが、視点に物事を置くために、私のラップトップは毎秒約300KのUUIDを生成することができます(上記の関数がそれぞれ呼び出されます)。

これは、各呼び出しでイベントループが約3.3マイクロ秒ブロックされることを意味します。requestの場合は、1回のリクエストで1回です(私は思う)。それはごくわずかです。

関連する問題