在节点中使用require而不仅仅是代码而不是文件

时间:2013-06-09 09:27:40

标签: javascript node.js coffeescript require

我在数据库中有代码,其中包含不同的节点模块。像这样:

exports.hello = hello

通常情况下,我会使用hello = require './hello.js'。但是,由于代码存储在db中,我不能包含该文件的路径。当我尝试做的时候

eval unescape hello_from_db_code不起作用。

有没有办法在没有文件路径的情况下获得require功能?

2 个答案:

答案 0 :(得分:1)

如果“不起作用”是“模块未导出且存在未定义的全局变量”,那么您可以尝试在上下文中使用缺少的引用进行评估:

vm = require 'vm'
requireFromString = (str, filename) ->
  sandbox =
    module:
      exports: {}
    require: require
    __filename: filename
  vm.runInNewContext(src, sandbox, filename)
  sandbox.module.exports

您可能希望添加对沙箱的额外引用,请查看module.js中的Module.prototype._compile函数。您也可以直接以hello = module._compile(hello_from_db_code)

的形式访问它

答案 1 :(得分:1)

我认为您不能使用此要求。见here ...

但是,您可以从db中读取代码,对其进行评估,然后将其导出。

无论如何,请尝试避免破坏模块缓存的黑客攻击。