6

require(...)node.jsの の引数はファイル名です。モジュールのソース コードが string にある 場合code、どうにかしてその string から関数を呼び出しrequire(code)てロードできますか?

4

2 に答える 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.jsrequire('./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 に答える