是否有一种标准方法要求Node模块位于某个URL(而不是本地文件系统)?
就像是:
require('http://example.com/nodejsmodules/myModule.js');
Run Code Online (Sandbox Code Playgroud)
目前,我只是将文件提取到一个临时文件中,并要求它.
Phi*_*lev 31
您可以使用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');
}));
});
Run Code Online (Sandbox Code Playgroud)
IMO,在没有替代方案的情况下,在服务器应用程序运行时内执行远程代码可能是合理的.只有当你信任远程服务和网络之间时.
小智 8
首先安装模块:
npm install require-from-url
Run Code Online (Sandbox Code Playgroud)
然后放入你的文件:
var requireFromUrl = require('require-from-url/sync');
requireFromUrl("http://example.com/nodejsmodules/myModule.js");
Run Code Online (Sandbox Code Playgroud)
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); });
}
});
});
Run Code Online (Sandbox Code Playgroud)
它仍然是异步版本,如果是同步负载,则需要sync http request module 例如
| 归档时间: |
|
| 查看次数: |
33641 次 |
| 最近记录: |