请教问题:nodejs 编写的addon内 如何通过V8引擎运行JS代码
发布于 10 年前 作者 tracking 5259 次浏览 最后一次编辑是 8 年前

###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);
};
回到顶部