C ++ надстройка для NodeJS вложенных функций не вызывается - PullRequest
0 голосов
/ 09 февраля 2019

Я пишу нативную надстройку NodeJ для c ++, используя v8, которая реализует минимальный Tic-Tac-Toe AI.

У меня проблема, когда вложенные функции не работают.

Вот мой код:

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 голосов
/ 09 февраля 2019

Этот ответ полезен только в том случае, если вы хотите перейти на использование N-API через привязки C ++, node-addon-api (доступно через npm).Вы используете C ++, так что это, вероятно, самый чистый способ сделать кодирование более простым и вероятным для работы.Нет, я не могу сказать вам, что не так с вашим кодом из того, что было опубликовано, так что если это showtopper, то не нужно читать дальше.

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

Я не знаю достаточно деталей, чтобы конкретизировать пример лучше.

Я работал с Nan до пакета node-addon-api и нашел его разочаровывающим.Я не пытался использовать V8 напрямую, потому что он связывает мое приложение с конкретной версией узла.

Если вас интересует более подробная информация, посмотрите https://github.com/nodejs/node-addon-api. Это действительно довольно хорошо сделано.

Извинения, если в каком-либо из приведенных выше кодов есть ошибки;Я только сделал это, как я пошел.

...