我在C++中为node.js编写了一个插件,遇到了一个小问题.我想在我的模块目录中读取配置文件,但无法以通常的方式找到它(__dirname),因为在C++中,全局对象似乎是空的.
有没有正确的方法来做到这一点,还是我需要诉诸黑客?
__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)