2011-12-24 17 views
1

如果我有一個源代碼字符串,也真正需要()的代碼,而不是文件

var code = "console.log('I\'ve been loaded.');"; 

,並希望在節點上運行它,通常它的建議使用

vm.runInThisContext(code, "NOT_A_FILE.mycode"); 

這是一切都很好,直到代碼變得更加複雜:

var code2 = "require('http');\n" + 
      "console.log(http);" // TODO make more useless 

在這種情況下,我們不能vm中運行代碼2,因爲它不會讓模塊具有require()函數,因爲vm只是V8 VM,而不是節點1。

這是我迄今爲止遇到的唯一問題 - 但我不知道可能出現其他問題。


所以,從根本上,我的問題是:什麼額外的功能並不require()製造節點模塊做的,我怎麼能保證我的「串」的模塊具有此功能?如果我需要這個功能,我最好只是做臨時文件,我實際上是require()

+0

你試圖解決什麼問題?這似乎是一種創造性的,但很差的做事方式。如果您實質上評估的是用戶生成的任何內容,則會引發問題。 – 2011-12-25 20:53:57

+0

@RyanOlds我有一個腳本,它將很多文件合併在一起,然後嘗試運行組合文件。組合文件的來源是沒有用的(我有標記顯示原始的行號等字符串中的調試)。 – 2011-12-25 21:53:15

+1

請讓我知道如果我的答案中的代碼不適合你。 – 2013-03-18 09:39:52

回答

0

vm.runInNewContext而不是vm.runInThisContext,然後在沙箱中運行它,你可以傳遞require對象!這就是它..

var vm = require('vm'); 
var code2 = "var http = require('http');\n" + "console.log(http);" //TODO make more useless 
vm.runInNewContext(code2, { 
require: require, 
http: require('http'), 
console: console 
}, 'yourvmfilename1'); 

或者你可以直接發送http對象。

var vm = require('vm'); 
var code3 = "console.log(http);" //TODO make more useless 
vm.runInNewContext(code3, { 
http: require('http'), 
console: console 
}, 'yourvmfilename2'); 
+0

這種方法的問題是在require調用中運行的代碼不會與其餘代碼共享它的環境,這意味着require('http')instanceof Object'將會是'false'等等。 – Jake 2014-06-01 00:07:45

相關問題