如何从Node.js中的URL请求

是否有一个标准的方式来要求一个节点模块位于某个URL(不在本地文件系统)?

就像是:

require('http://example.com/nodejsmodules/myModule.js'); 

目前,我只是简单地将文件读取到一个临时文件中,并且要求。

您可以使用http.get方法获取模块,并使用vm模块方法runInThisContext和runInNewContext在沙盒中执行它。

 var http = require('http') , vm = require('vm') , concat = require('concat-stream'); // this is just a helper to receive the // http payload in a single callback // see https://www.npmjs.com/package/concat-stream http.get({ host: 'example.com', port: 80, path: '/hello.js' }, function(res) { res.setEncoding('utf8'); res.pipe(concat({ encoding: 'string' }, function(remoteSrc) { vm.runInThisContext(remoteSrc, 'remote_modules/hello.js'); })); }); 

国际海事组织,执行服务器应用程序运行时内的远程代码可能是合理的情况下没有替代品。 而且只有当你信任到远程服务和networking之间。

如果你想要更类似的东西,你可以这样做:

 var http = require('http') , vm = require('vm') , concat = require('concat-stream') , async = require('async'); function http_require(url, callback) { http.get(url, function(res) { // console.log('fetching: ' + url) res.setEncoding('utf8'); res.pipe(concat({encoding: 'string'}, function(data) { callback(null, vm.runInThisContext(data)); })); }) } urls = [ 'http://example.com/nodejsmodules/myModule1.js', 'http://example.com/nodejsmodules/myModule2.js', 'http://example.com/nodejsmodules/myModule3.js', ] async.map(urls, http_require, function(err, results) { // `results` is an array of values returned by `runInThisContext` // the rest of your program logic }); 

您可以覆盖.js文件的默认需求处理程序:

 require.extensions['.js'] = function (module, filename) { // ... } 

您可能需要签出更好的需求,因为它对于许多文件格式来说都是非常重要的。 (我写的)

0依赖版本(需要节点6+,您可以简单地将其更改回ES5)

 const http = require('http'), vm = require('vm'); ['http://example.com/nodejsmodules/myModule.js'].forEach(url => { http.get(url, res => { if (res.statusCode === 200 && /^text\/javascript/.test(res.headers['content-type'])) { let rawData = ''; res.setEncoding('utf8'); res.on('data', chunk => { rawData += chunk; }); res.on('end', () => { vm.runInThisContext(rawData, url); }); } }); }); 

它仍然是asynchronous版本,如果是同步加载的话,应该要求一个sync http request module