12.0.0 上 NODE_MODULE 函数中的本机附加组件编译错误,适用于 11.15.0

Native add-on compilation error in NODE_MODULE function on 12.0.0, works on 11.15.0

我正在维护 aerospike 包,这是 Aerospike No-SQL 数据库的客户端 SDK。在 v11.15.0 及之前的 Node.js 版本上,此包编译并运行良好。但是从 v12.0.0 开始,我在构建本机附加组件时遇到编译时错误,我无法解决。

该函数出现错误(略略):

void Aerospike(Handle<Object> exports, Handle<Object> module)
{
    AerospikeClient::Init();
    export("client", Nan::New<FunctionTemplate>(client)->GetFunction());
        // more exports
}

NODE_MODULE(aerospike, Aerospike)

我得到的错误是:

  CXX(target) Release/obj.target/aerospike/src/main/aerospike.o
../src/main/aerospike.cc:102:6: error: variable has incomplete type 'void'
void Aerospike(Handle<Object> exports, Handle<Object> module)
     ^
../src/main/aerospike.cc:102:23: error: 'Object' does not refer to a value
void Aerospike(Handle<Object> exports, Handle<Object> module)
                      ^
/Users/jhecking/.node-gyp/12.0.0/include/node/v8.h:3356:17: note: declared here
class V8_EXPORT Object : public Value {
                ^
../src/main/aerospike.cc:102:16: error: use of undeclared identifier 'Handle'
void Aerospike(Handle<Object> exports, Handle<Object> module)
               ^
../src/main/aerospike.cc:102:31: error: use of undeclared identifier 'exports'
void Aerospike(Handle<Object> exports, Handle<Object> module)
                              ^
../src/main/aerospike.cc:102:47: error: 'Object' does not refer to a value
void Aerospike(Handle<Object> exports, Handle<Object> module)
                                              ^
/Users/jhecking/.node-gyp/12.0.0/include/node/v8.h:3356:17: note: declared here
class V8_EXPORT Object : public Value {
                ^
../src/main/aerospike.cc:102:40: error: use of undeclared identifier 'Handle'
void Aerospike(Handle<Object> exports, Handle<Object> module)
                                       ^
../src/main/aerospike.cc:102:55: error: use of undeclared identifier 'module'
void Aerospike(Handle<Object> exports, Handle<Object> module)
                                                      ^
../src/main/aerospike.cc:102:62: error: expected ';' after top level declarator
void Aerospike(Handle<Object> exports, Handle<Object> module)
                                                             ^
                                                             ;
8 errors generated.

该模块使用较旧的 C++ 附加组件 API,而不是 n-api。我使用的是最新版本 nan v2.13.2.

这个错误也可以在 Travis CI 作业中看到:https://travis-ci.org/aerospike/aerospike-client-nodejs/jobs/523788617

完整的源代码在这里:https://github.com/aerospike/aerospike-client-nodejs/blob/2b9554d1158abda58c17cfbd0438d78f0212ef9e/src/main/aerospike.cc#L102

NODE_MODULE 的第二个参数的正确签名是 void InitializerFunction(Local<Object> exports[, Local<Value> module]) (ref)。 Handle 已从 v8 中删除;它的替换是 Local.

如果您不升级到 N-API,NAN 是避免这些更改的好方法。