未调用NodeJS嵌套函数的C ++插件

时间:2019-02-08 22:06:29

标签: c++ node.js function add-on node.js-addon

我正在使用实现minimax井字游戏AI的v8编写c ++ NodeJs本机加载项。

我有一个嵌套函数不起作用的问题。

这是我的代码:

namespace Game {
    Move bestMove(...) {
        // implementation
    }
}
namespace addon {
    using namespace v8;
    using std::vector;
    ...

    // this function returns the best move back to nodejs
    void bestMove(const FunctionCallbackInfo<Value>& args) {
        Isolate* isolate = args.GetIsolate();
        ...

        auto returnVal = Game::bestMove(params); // Game::bestMove() returns the best move for the computer

        args.GetReturnValue().Set((returnVal.row * 3) + returnVal.col); // returns the move back to nodejs
}

通常,如果游戏板是这个(计算机是o):

    x _ _
    _ _ _
    _ _ _

该函数不应返回0,因为x已使用该函数。 但是,它似乎总是返回0

经过一番调查,我意识到函数Game::bestMove()从未被调用。

添加是的,我知道这是问题所在,因为在函数std::cout << "Computing";中添加了Move bestMove()之后,它再也没有输出到控制台了。

但是,如果我在函数std::cout << "Computing";中添加addon::bestMove(),它将起作用。

也没有抛出编译时错误。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

仅当您愿意通过C ++绑定node-addon-api(可通过npm获取)使用N-API时,此答案才有用。您正在使用C ++,因此它可能是使编码更直接,更可行的最干净的方法。净,从发布的内容中我无法告诉您代码的问题所在,因此,如果这是showstopper,则无需继续阅读。

使用node-addon-api,您的插件将类似于:

#include <napi.h>

// your move function
Napi::Value bestMove(const Napi::CallbackInfo& info) {
  Napi::Env env = info.Env();

  int move = Game::bestMove(params);

  // just return the number and the C++ inline wrappers handle
  // the details
  return Napi::Number::New(env, move);
}

// the module init function used in the NODE_API_MODULES macro below
Napi::Object Init(Napi::Env env, Napi::Object exports) {
  Napi::HandleScope scope(env);

  // expose the bestMove function on the exports object.
  exports.Set("bestMove", Napi::Function::New(env, bestMove));

  return exports;
}

NODE_API_MODULES(my_game, Init)

在JavaScript中,您只需要绑定文件(通常在build/Release/my_game.node中)(或使用绑定包,因此您只需要require('my_game'))。所以

const game = require('my_game')
...

move = game.bestMove()

我不知道足够的细节来充实示例。

我在加入node-addon-api软件包之前与Nan一起工​​作,发现它令人沮丧。我没有尝试直接使用V8,因为它将我的应用程序绑定到特定版本的节点。

如果您对更多详细信息感兴趣,请查看https://github.com/nodejs/node-addon-api。确实做得很好。

如果上述任何代码有错误,我们深表歉意;我刚走完就化妆。