请教问题:nodejs 编写的addon内 如何通过V8引擎运行JS代码
###run.cpp:
#define BUILDING_NODE_EXTENSION
#include <node.h>
using namespace v8;
Handle<Value> run(const Arguments& args) {
HandleScope scope;
if (args.Length() < 1) {
ThrowException(Exception::TypeError(String::New("Args Error")));
return scope.Close(Undefined());
}
if (!args[0]->IsString()) {
ThrowException(Exception::TypeError(String::New("Args Error")));
return scope.Close(Undefined());
}
Persistent<Context> context = Context::New();
Context::Scope context_scope(context);
Local<Script> scritp = Script::Compile(args[0]->ToString());
Local<Value> result = scritp->Run();
return scope.Close(result);
}
void Init(Handle<Object> exports) {
exports->Set(String::NewSymbol("run"),
FunctionTemplate::New(run)->GetFunction());
}
NODE_MODULE(run, Init)
###test.js:
var addons = require('./run.node');
addons.run("console.log('hello world')");
###运行 使用命令:node test.js 报错:
ReferenceError: console is not defined
at <anonymous>:1:1
at Object.<anonymous> (C:\Users\fx\Documents\Visual Studio 2010\Projects\helloworld\Debug\test.js:2:8)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
at node.js:902:3
也不知道是啥问题,跪求高手现身
2 回复
可能 原因是console 不是标准的js库,你试试addons.run("‘Hello’ + ‘, World!’");看看结果是不是Hello,World
嗯,确实是这样,但是我想实现的功能类似于这里的 module._compile 方法,这个方法能将文件读入后compile成function。
// Native extension for .js
Module._extensions['.js'] = function(module, filename) {
var content = NativeModule.require('fs').readFileSync(filename, 'utf8');
module._compile(stripBOM(content), filename);
};