2012-06-07 28 views
1

我目前正在研究一個node.js項目,該項目需要在運行時和運行期間生成和更改內存中的對象。我知道這聽起來令人困惑,所以這裏是一個例子。node.js並在運行時/期間生成模塊

週一上午10點:

var PI = Math.PI; 

exports.area = function (r) { 
    return PI * r * r; 
}; 

週一上午11點:

var PI = Math.PI; 
var minSize = 10; 

exports.area = function (r) { 
    if (r >= minSize) { 
     return PI * r * r; 
    } else { 
     return "Error: Minimum size not met."; 
    } 
}; 

週一中午12點:

var PI = Math.PI; 
var minSize = 10; 
var msg = "Error: Minimum size of " + minSize + "not met.";  

exports.area = function (r) { 
    if (r >= minSize) { 
     return PI * r * r; 
    } else { 
     return msg; 
    } 
}; 

週二上午10點:

var PI = Math.PI; 
var minSize = 15; 
var error['eng'] = "Error: Minimum size of " + minSize + "not met.";  
var error['chn'] = "錯誤:不符合最小尺寸:" + minSize + "。"  

exports.area = function (r) { 
    if (r >= minSize) { 
     return PI * r * r; 
    } else { 
     return error; 
    } 
}; 

exports.circumference = function (r) { 
    if (r >= minSize) { 
     return 2 * PI * r; 
    } else { 
     return error; 
    } 
}; 

這是一個有點人爲的例子,因爲大部分的變化都可以通過適當的計劃來避免,但我知道,但這有點說明問題。該模塊在變量和函數中保持更改,並在服務器運行時進行擴展。

這裏是我的限制:

  • 使用原型繼承(沒有關鍵字「新」)
  • 更改將在函數的下一個通話效果
  • 的變化包括增加新的變量,功能
  • 變化需要保存服務器重新啓動
  • 不能使用eval()

我想到了兩種可能的策略:

  1. 使用.prototype,繼續添加/修改函數和變量。

    • 優點:能夠作爲服務器運行的是
    • 缺點做到這一點:我不知道如何將它保存到文件。據我知道,我不能保存功能,而不以某種方式
  2. 直接編輯文件,並通過類似node-supervisor重裝他們使用eval()到文件。

    • 優點:更改將被保存在,版本可以保存並恢復到
    • 缺點:我覺得直接編輯文件將使用eval(),即或多或少具有相同的結果,如果有人系統可能會破壞某些惡意行爲。

這就是我現在能想到的。希望在這方面的任何意見或選擇。

回答

0

以供將來參考:

  • node.js' vm module有幾個runInContext()功能,這將有效地Sandbox中執行,並阻止訪問其範圍以外的變量。有a blog entry here,討論不同版本之間的差異,與現有的基準
  • 還有一個可用於node.js的sandbox模塊
  • 在沙箱中運行的東西的缺點是執行是慢了很多

結論:存儲函數並在沙箱範圍內安全地執行它們並不是不可能的,但它不是很實用。

替代解決方案:如果函數本身不是太複雜,則不可能將調用以DSL的形式存儲並在之後將其解析出來。

相關問題