【问题标题】:C++ add-on for NodeJS nested functions not being called未调用 NodeJS 嵌套函数的 C++ 插件
【发布时间】:2019-07-03 04:41:51
【问题描述】:

我正在使用实现 minimax tic-tac-toe 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() 永远不会被调用。

添加是的,我知道这是问题所在,因为在函数Move bestMove() 中添加std::cout &lt;&lt; "Computing"; 后,它从未打印到控制台。

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

也没有抛出编译时错误。

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    仅当您愿意通过 C++ 绑定 node-addon-api(可通过 npm 获得)使用 N-API 时,此答案才有用。您正在使用 C++,因此它可能是使编码更简单且可能工作的最简洁的方法。 Net,我无法从发布的内容中告诉您您的代码有什么问题,所以如果那是最引人注目的,那么无需继续阅读。

    使用 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 中(或者使用绑定包,这样您就可以只需要('my_game'))。所以

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

    我没有足够的细节来更好地充实这个例子。

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

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

    如果以上任何代码有错误,我们深表歉意;我只是边走边编的。

    【讨论】:

    • 感谢您的快速回复!这真的很有帮助。
    • 我明白了。很难找到关于这些东西的权威文档,而且在这个领域工作的 stackoverflow 上没有多少人。如果您接受答案(您赞成),这对您有用,我将不胜感激。我之所以提到它,是因为您是 stackoverflow 的新手。
    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    相关资源
    最近更新 更多