cómo solicitar desde la URL en Node.js

Hay una manera estándar de requerir un Nodo del módulo situado en la parte de la URL (no en el sistema de archivos local)?

Algo como:

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

Actualmente, soy simplemente ir a buscar el archivo en un archivo temporal, y que requieren que.

  • Te das cuenta de que depende de un servidor HTTP remoto que constantemente te dan el código fuente es tonto. Y, de confiar en el servidor HTTP remoto para que no le hagan código inseguro es simplemente más allá de ridiculious
  • Si cualquier cosa, usted debe proporcionar algún mecanismo para evitar que un hombre-en-el-medio de ataque o de recuperar todos los archivos a través de https, lo que hará que ir a buscar más lento.
  • no es tonto del todo. te permite construir esqueletos con funcionalidades básicas que otros pueden aprovechar
InformationsquelleAutor | 2011-10-18

4 Kommentare

  1. 31

    Puede obtener el módulo de uso de http.obtener método y se ejecuta en el entorno limitado el uso de vm módulo de métodos de runInThisContext y runInNewContext.

    Ejemplo

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

    De la OMI, la ejecución de código remoto en el interior de la aplicación de servidor en tiempo de ejecución puede ser razonable en el caso sin alternativas. Y sólo si confía en el servicio remoto y la red entre.

    • Estoy upvoting por la información, pero me gustaría que en vez de decir «es realmente mala práctica», que se molestó en explicar porque.
    • ¿por qué la ejecución de la distancia, no por su propia distribuido y probado el código de la aplicación en tiempo de ejecución puede ser buena idea? Si el sistema remoto está fuera de su propio/control de la empresa, entonces no es seguro por defecto, en mi humilde opinión. Si el sistema remoto de su propio o de la empresa en red no es segura debido a las muchas oportunidades para el compromiso de código en el medio. En otro caso, si el sistema remoto está bajo su control, ¿por qué usted necesita para la solicitud, transferencia y ejecutar código en lugar de transferir los datos a través de la red y compartir el código para trabajar con el uso de node.js los módulos?
    • 1. Tal vez el código está disponible a través de HTTPS en una amplia confianza CDN o a través de un socio de confianza. 2. Tal vez el código está disponible a través de HTTPS en una distancia de ubicación interna. 3. Tal vez el código es empaquetada y distribuida interiormente de tal manera que el acceso a la FS, donde es finalmente ejecutado está bloqueado y por lo npm no puede ser utilizado. Estos son sólo la parte superior de mi cabeza; tal vez ellos no son buenas razones, pero son los motivos. Y de todos modos, mi punto era, simplemente, que es más útil para explicar las razones por las que la opinión de la etiqueta de «mala práctica» y no decir nada más. Que tu comentario ahora!
    • «tal vez ellos no son buenas razones, pero son razones» – es lo que me ha llamado la «mala práctica». Nadie puede encontrar una razones para matar a los gatitos, tengo que dejar de llamarlos «malo»? En cualquier caso, me gustaría editar la respuesta a suavizar el tono de mi opinión.
    • En este día y edad, HTTP-GET debe ser considerado como un método perfectamente válido de referencia/apertura de un archivo. Lo que implica que los archivos son de alguna manera más segura, ya que wgetted a su unidad de disco duro local en primer lugar, es muy similar a la de seguridad a través de oscuridad. Un archivo de confianza no debe medirse sólo por si tiene acceso a través de FILE:// o HTTPS?://
    • Gracias por una respuesta útil, aunque! 🙂
    • archivo de la honradez no debe medirse sólo por si tiene acceso a través de FILE:// o HTTPS?://» y es por eso que me nota «sólo si confía en el servicio remoto y la red entre».
    • Así, no se requiere nada de «github» en la producción de la aplicación 😉
    • Gracias por la respuesta. Como para la «ejecución de código remoto»; en estos días, la mayoría de nodo aplicaciones se inicializan con npm install que tira de la web. ¿Cómo es eso diferente de lo que el op se pretende hacer en el espíritu? No hay nada de malo en la práctica acerca de la idea en general, pero nada puede estar mal hecho; la creación de los riesgos de seguridad. Yo estoy mirando para hacer esto mismo para gestionar mi script de configuración (no SÓLO json, ya que requiere más inteligencia) y tengo rotación de las claves para proteger a las solicitudes, que nadie sabe, pero la aplicación de todas formas (más seguro que el mecanismo nacional de prevención de módulos).

  2. 3

    Si quieres algo más como require, usted puede hacer esto:

    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. 3

    0 dependencia de la versión (nodo 6+ requerido, usted puede simplemente cambiar de nuevo a 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); });
            }
        });
    });

    Es todavía la versión asíncrona, si la sincronización de la carga es el caso, un sync http request module por ejemplo debería ser necesario

  4. 1

    Puede sobrescribir el valor predeterminado requiere controlador .js:

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

    Usted podría desea obtener mejor-requieren como lo hace bastante esto para muchos formatos de archivo. (Lo escribí)

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea