require(...)
node.jsの の引数はファイル名です。モジュールのソース コードが string にある 場合code
、どうにかしてその string から関数を呼び出しrequire(code)
てロードできますか?
質問する
529 次
2 に答える
2
これを再利用のために関数に入れました。ランダム ハッシュに基づいて os temp ディレクトリにファイルを作成し、それを要求してから削除します。
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);
これはまだ回避策ですが、より便利に使用できると思います。
于 2013-06-13T11:16:10.650 に答える
1
回避策として、モジュールのソース コードを一時ファイルに書き込んでから、ファイル./tmp-file.js
をrequire('./tmp-file')
削除します。
ファイルをブロックして同期的に書き込むか、そのモジュールを必要とするすべてのものを非同期書き込みへのコールバックに入れる必要があるため、これはおそらく最適ではありません。
非同期ファイル書き込みの実際の例 (要点 - 同期ファイル書き込みも含まれます):
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
于 2012-08-23T16:21:36.057 に答える