1

我的node.js有这个问题,我在启动我的应用程序时使用节点--trace-sync-io,当我使用request模块和request-promise模块对我的server.js文件进行api调用时,它仍然警告我正在使用 Sync API 并指向我的 request.promise 调用的开始。

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
})

所以当我用命令启动节点时,node --trace-sync-io server.js我得到了WARNING: Detected use of sync API堆栈跟踪

(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)

它指向我开始调用的行 rp(options.then(function(data)))

4

1 回答 1

1

堆栈跟踪指向包内的以下函数(内部使用它来生成多部分分隔符):uuidrequest

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

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

crypto.randomBytes()在这里同步调用,这就是您收到警告的原因。

但是,这并不一定意味着此代码会通过阻塞事件循环而导致大问题。当然,它是同步的,因此是阻塞的,但从长远来看,我的笔记本电脑每秒可以生成大约 300K UUID(每个都调用上面的函数)。

这意味着每次调用事件循环将被阻塞大约 3.3 微秒,在 的情况下request,每个请求一次(我认为)。这是微不足道的。

于 2017-05-07T19:34:34.460 回答