Node NAPI Aync Workers 没有收到正确的字符串

问题描述

我目前正在尝试使用具有 2 个参数的函数构建本机模块:一个字符串和一个回调。当我一次只运行一个异步工作者时,这很有效,但是当我必须同时启动 200 时,字符串参数没有正确传递。 nodejs代码

const bindingPath = require.resolve(`./build/Release/myBinding`);
const binding = require(bindingPath);

function init(config){
  return new Promise((resolve,reject) => {
    binding.init(config,(err,response) => {
            if(err) reject(err);
            else resolve(response);
        })
  })
}

async function main(){
  // .... some code .... 
  console.log(await init("this works"))
  
  var responses = [];
  var promises = [];
  for(var i = 0; i < 100; i++){
    promises.push(init("this won't work").then((response)=>{
      responses.push(response)
    }))
  }
  await Promise.all(promises);
  console.log(responses)
}

main();

cpp 代码

class InitWorker : public Napi::AsyncWorker {
public:
    InitWorker(Napi::Function& callback,const char* config)
    : Napi::AsyncWorker(callback),config(config),response("")
    {
    }

    ~InitWorker() {}

protected:
void Execute() override {
  response = (char*) config;
}

void OnError(const Napi::Error& e) override
{
  Napi::Env env = Env();

  Callback().MakeCallback(
    Receiver().Value(),{
      e.Value(),env.Undefined()
    }
  );
}

void OnOK() override {
    Callback().Call({Env().Null(),Napi::String::New(Env(),response)});
}

private:
    char* response;
    const char* config;
};
    Napi::Value initFunc(const Napi::CallbackInfo& info) {
  Napi::Env env = info.Env();
  if (info.Length() < 2) {
    Napi::TypeError::New(env,"Wrong number of arguments")
        .ThrowAsJavaScriptException();
    return env.Null();
  }

  if (!info[0].Isstring()) {
    Napi::TypeError::New(env,"invalid config argument")
        .ThrowAsJavaScriptException();
    return env.Null();
  }

  if (!info[1].IsFunction()) {
      Napi::TypeError::New(env,"invalid callback function")
        .ThrowAsJavaScriptException();

    return env.Null();
  }

  
  std::string str = info[0].ToString().Utf8Value();
  const char* config = str.c_str();

  Napi::Function cb = info[1].As<Napi::Function>();

  InitWorker* initWorker = new InitWorker(cb,config);
  initWorker->Queue();
  return info.Env().Undefined();
}

当我构建代码并运行它时,会得到以下输出

this works
[
'\u0001�\u0001\u0002�\u0001\r\\\u000f\u001c\n�\u0001\r\u001b\u000f\u001c\u000b�\u0001\u0002�\u0002\r\\\r',"this won't work",'0�\u001d6�\u0001',"�'6�\u0001",...
]

如您所见,许多字符串无法正确传递。我怀疑是怎么回事 info[0].ToString().Utf8Value() 被异步调用

非常感谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)