Подтвердить что ты не робот

Как требовать от URL-адреса в Node.js

Существует ли стандартный способ использования модуля Node, расположенного на некотором URL (не в локальной файловой системе)?

Что-то вроде:

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

В настоящее время я просто извлекаю файл во временный файл и требую этого.

4b9b3361

Ответ 1

Вы можете извлечь модуль, используя метод 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');
    }));
});

IMO, выполнение удаленного кода внутри серверного приложения может быть разумным в случае без альтернатив. И только если вы доверяете удаленной службе и сети между ними.

Ответ 2

Если вы хотите нечто вроде require, вы можете сделать это:

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

Ответ 3

Вы можете перезаписать обработчик по умолчанию для файлов .js:

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

Возможно, вы захотите проверить better-require, так как это довольно много для многих форматов файлов. (Я написал это)

Ответ 4

0 версия зависимости (node 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); });
        }
    });
});

Это по-прежнему асинхронная версия, если требуется синхронизировать нагрузку, требуется sync http request module