需要nodejs

require(...)在node.js中的参数是一个文件名。 如果我有一个string code模块源代码 ,我可以以某种方式调用require(code)并从该string加载函数?

解决办法可能是将模块源代码写入临时文件./tmp-file.js ,然后require('./tmp-file') ,然后删除该文件。

这可能不是最佳select,因为您要么必须同步地阻止和写入文件,要么将所有需要该模块的内容都放在callback中进行asynchronous写入。

一个asynchronous文件写入的工作示例(主要- 也包括同步文件写入 ):

 var http = require('http'); var fs = require('fs'); var helloModuleString = "exports.world = function() { return 'Hello World\\n'; }"; fs.writeFile('./hello.js', helloModuleString, function (err) { if (err) return console.log(err); var hello = require('./hello'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end(hello.world()); }).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/'); }); 

结果是:

 $ curl 127.0.0.1:1337 > Hello World 

我把这个function重用。 它在OS临时目录中创build一个基于随机哈希的文件,需要它然后删除它。

 var fs = require('fs'), os = require('os'), crypto = require('crypto'); function requireString(moduleString) { var token = crypto.randomBytes(20).toString('hex'), filename = os.tmpdir() + '/' + token + '.js', requiredModule = false; // write, require, delete fs.writeFileSync(filename, moduleString); requiredModule = require(filename); fs.unlinkSync(filename); return requiredModule; } 

那你可以这样做:

 var carString = "exports.start = function(){ console.log('start'); };", car = requireString(carString); console.log("Car:", car); 

我认为,这仍然是一个解决方法,但更方便使用。