当前node.js c ++插件的路径

Iva*_*din 0 c++ node.js

我在C++中为node.js编写了一个插件,遇到了一个小问题.我想在我的模块目录中读取配置文件,但无法以通常的方式找到它(__dirname),因为在C++中,全局对象似乎是空的.

有没有正确的方法来做到这一点,还是我需要诉诸黑客?

log*_*yth 6

__dirname 不是全局的,它在模块运行时自动添加到模块的范围内,否则每个模块都会看到一个公共目录名,这没有意义.

C++初始化模块时会传递几个参数,就像JS模块一样.对于模块,其中许多都是自动暴露的.我假设你的模块中有这个:

static void init (v8::Handle<v8::Object> target) {
Run Code Online (Sandbox Code Playgroud)

但是您可以访问更多参数

static void init (v8::Handle<v8::Object> target, v8::Handle<v8::Object> module) {
Run Code Online (Sandbox Code Playgroud)

所以你可以读取模块的文件名:

v8::Local<v8::String> filename =
        module->Get(v8::String::NewSymbol("filename")).As<v8::String>();
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下方法处理其中的目录名称path:

Local<Function> require = Local<Function>::Cast(
    module->Get(String::NewSymbol("require")));

Local<String> filename = module->Get(String::NewSymbol("filename")).As<String>();

Local<Value> args[] = {String::New("path")};
Local<Object> pathModule = require->Call(Object::New(), 1, args).As<Object>();
Local<Function> dirname = pathModule->Get(String::NewSymbol("dirname")).As<Function>();

Local<Value> arg2[] = {filename};
Local<String> moduleDirname = dirname->Call(pathModule, 1, arg2).As<String>();
Run Code Online (Sandbox Code Playgroud)