未调用 NodeJS 嵌套函数的 C++ 附加组件
C++ add-on for NodeJS nested functions not being called
我正在使用实现极小极大井字棋 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 _ _
_ _ _
_ _ _
该函数不应该 return 0
因为它已经被 x
使用了。
然而它似乎总是 return 0
.
经过一番调查,我意识到函数 Game::bestMove()
从未被调用过。
添加 是的,我知道这是问题所在,因为在函数 Move bestMove()
中添加 std::cout << "Computing";
之后,它从未打印到控制台。
但是,如果我在函数 addon::bestMove()
中添加 std::cout << "Computing";
,它会起作用。
也没有抛出编译时错误。
感谢您的帮助。
此答案仅在您愿意通过 C++ 绑定 node-addon-api(可通过 npm 获得)转向使用 N-API 时才有用。您正在使用 C++,因此它可能是使编码更直接且更可能工作的最干净的方法。 Net,我无法从发布的内容中告诉您您的代码有什么问题,所以如果那是 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
中(或使用绑定包,这样您就可以只需要('my_game'))。所以
const game = require('my_game')
...
move = game.bestMove()
我不知道足够的细节来更好地充实这个例子。
我在 node-addon-api 包之前与 Nan 一起工作,发现它令人沮丧。我没有尝试直接使用 V8,因为它将我的应用程序绑定到特定版本的节点。
如果您对更多详细信息感兴趣,请查看 https://github.com/nodejs/node-addon-api。真的做得很好。
如果上述任何代码有错误,我们深表歉意;我是边走边编的。
我正在使用实现极小极大井字棋 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 _ _
_ _ _
_ _ _
该函数不应该 return 0
因为它已经被 x
使用了。
然而它似乎总是 return 0
.
经过一番调查,我意识到函数 Game::bestMove()
从未被调用过。
添加 是的,我知道这是问题所在,因为在函数 Move bestMove()
中添加 std::cout << "Computing";
之后,它从未打印到控制台。
但是,如果我在函数 addon::bestMove()
中添加 std::cout << "Computing";
,它会起作用。
也没有抛出编译时错误。
感谢您的帮助。
此答案仅在您愿意通过 C++ 绑定 node-addon-api(可通过 npm 获得)转向使用 N-API 时才有用。您正在使用 C++,因此它可能是使编码更直接且更可能工作的最干净的方法。 Net,我无法从发布的内容中告诉您您的代码有什么问题,所以如果那是 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
中(或使用绑定包,这样您就可以只需要('my_game'))。所以
const game = require('my_game')
...
move = game.bestMove()
我不知道足够的细节来更好地充实这个例子。
我在 node-addon-api 包之前与 Nan 一起工作,发现它令人沮丧。我没有尝试直接使用 V8,因为它将我的应用程序绑定到特定版本的节点。
如果您对更多详细信息感兴趣,请查看 https://github.com/nodejs/node-addon-api。真的做得很好。
如果上述任何代码有错误,我们深表歉意;我是边走边编的。