Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从Node.js中的URL请求_Javascript_Node.js - Fatal编程技术网

Javascript 如何从Node.js中的URL请求

Javascript 如何从Node.js中的URL请求,javascript,node.js,Javascript,Node.js,是否有一种标准方法要求节点模块位于某个URL(不在本地文件系统上) 比如: require('http://example.com/nodejsmodules/myModule.js'); 目前,我只是将该文件提取到一个临时文件中,并需要它 您可以使用方法获取模块,并使用模块方法和在沙箱中执行它 范例 var http = require('http') , vm = require('vm') , concat = require('concat-stream'); // this

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

比如:

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

目前,我只是将该文件提取到一个临时文件中,并需要它

您可以使用方法获取模块,并使用模块方法和在沙箱中执行它

范例

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');
    }));
});

在我看来,在没有替代方案的情况下,在服务器应用程序运行时内执行远程代码可能是合理的。并且只有信任远程服务和之间的网络。

才能覆盖.js文件的默认require处理程序:

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

您可能需要签出,因为对于许多文件格式,签出几乎都是如此。(我写的)

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

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
});
0依赖项版本(需要节点6+,只需将其更改回ES5即可)

consthttp=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'])){
让rawData='';
res.setEncoding('utf8');
res.on('data',chunk=>{rawData+=chunk;});
res.on('end',()=>{vm.runinthiscoxt(rawData,url);});
}
});
});

它仍然是异步版本,如果是同步加载,则需要一个
同步http请求模块

首先安装模块:


  const localeSrc = 'https://www.trip.com/m/i18n/100012631/zh-HK.js';
  const http = require('http');
  const vm = require('vm');
  const concat = require('concat-stream');
  http.get(
    localeSrc,
    res => {
      res.setEncoding('utf8');
      res.pipe(
        concat({ encoding: 'string' }, remoteSrc => {
          let context = {};
          const script = new vm.Script(remoteSrc);
          script.runInNewContext(context);
          console.log(context);
        }),
      );
    },
    err => {
      console.log('err', err);
    },
  );
npm install require-from-url
然后放入您的文件:

var requireFromUrl = require('require-from-url/sync');
requireFromUrl("http://example.com/nodejsmodules/myModule.js");

您意识到,依赖远程HTTP服务器一致地提供源代码是愚蠢的。然后,相信远程HTTP服务器不会给你不安全的代码是再可笑不过了。如果有什么,你应该提供一些机制来防止中间人攻击或通过https获取所有文件,这将使获取速度变慢。这一点都不傻。它允许您使用其他人可以使用的核心功能构建骨架leverage@Raynos你说这很愚蠢,但这正是Ryan Dahl为Deno所做的选择。我对信息投了赞成票,但我真的希望你能费心解释原因,而不是仅仅说“这真的是一种糟糕的做法”。@DanTaoСcounter问题:为什么要执行远程,不是你自己的分布式和测试代码在你的应用程序运行时可以是一个好主意?如果远程系统不受您自己/公司的控制,则默认情况下不安全,imho。如果远程系统脱离了你自己的公司网络,这是不安全的,因为有很多机会在中间妥协代码。在其他情况下,如果远程系统在您的控制下,为什么您需要请求、传输和执行代码,而不是通过网络传输数据和共享代码来使用node.js模块?1。也许代码可以通过广泛信任的CDN中的HTTPS或通过受信任的合作伙伴获得。2.也许代码可以通过远程内部位置的HTTPS获得。3.可能代码在内部打包和分发的方式会阻止对最终执行它的FS的访问,因此无法使用npm。这些都是我脑子里想不出来的;也许它们不是很好的理由,但它们是理由。不管怎么说,我的观点很简单,解释一个观点的基本原理比给它贴上“坏习惯”的标签,什么都不说更有用。你现在的评论就是这样!在当今时代,HTTP-GET应该被认为是引用/打开文件的一种完全有效的方法。暗示文件在某种程度上更安全,因为您首先将它们放入本地硬盘驱动器,这非常类似于隐蔽性带来的安全性。一个文件的可信度不应该仅仅通过您是通过file://还是HTTPS?://访问它来衡量,因此,不需要在生产应用程序中使用“github”中的任何内容;)可悲的是,它被弃用了……嗨!欢迎来到SO。在发布答案时,请务必解释您的解决方案如何工作以及如何解决问题。我认为您应该在
if(res.statusCode==200&/^application\/javascript/.test(res.headers['content-type'])中使用'application/javascript'而不是'text/javascript'
如果脚本是gzip提供的,那么这似乎不起作用