2011-12-26 16 views
28

¿Es posible usar jQuery.ajax() en node.js exactamente como es sintaxis?jQuery.ajax() en node.js?

Estoy tratando de compartir el código del navegador que no es UI con node.js. No quiero reemplazar todas las llamadas a funciones existentes con mi propio contenedor.

Actualmente, cuando lo intento, dice "Sin transporte" de forma predeterminada porque jQuery realiza la detección de dominio. Si lo desactivo configurando jQuery.support.cors, diría que XMLHttpRequest.open() no está disponible.

+2

Anular el método Ajax de jQuery con un cliente HTTP pequeño en Nodo sería una mejor opción que reemplazar todas las llamadas existentes en el código, pero aún así es un hacky. –

+0

[# 380] (https://github.com/tmpvar/jsdom/issues/380) hace referencia a este problema. Acabo de actualizar mi paquete [nq] (https://npmjs.org/package/nq) para solucionarlo. – abernier

Respuesta

35

que fue capaz de resolver el problema "no hay transporte" usando el módulo de XMLHttpRequest, así:

var $ = require('jquery'), 
    XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; 

$.support.cors = true; 
$.ajaxSettings.xhr = function() { 
    return new XMLHttpRequest(); 
}; 
+0

excelente trabajo ... esa fue la solución que estaba buscando :) –

8

Si desea que la sintaxis exacta jQuery.ajax, tratar https://github.com/driverdan/node-XMLHttpRequest

Pero en realidad si tiene control sobre lo que está llamando para ajax, debe hacerlo con el nodo de http.request o un módulo como request

+1

No es tan intuitivo como lo había pensado. El módulo [node jquery] (http://search.npmjs.org/#/jquery) tiene soporte integrado para [node-XMLHttpRequest] (http://search.npmjs.org/#/xmlhttprequest). Sin embargo, se ha roto por la versión más reciente de jsdom. – voidvector

+0

@voidvector: tienes razón, jsdom ahora define una función 'noop' ​​'XMLHttpRequest' como se hace referencia aquí: https://github.com/tmpvar/jsdom/issues/380 – abernier

8

también consideran najax, un contenedor para el módulo de solicitud de nodo que permite synt estilo jQuery hacha para el lado del servidor solicita

https://github.com/alanclarke/najax

var najax = require('najax'); 
najax('http://www.google.com', function(html){ console.log(html); }); 
najax('http://www.google.com', { type:'POST' }, function(html){ console.log(html); }); 
najax({ url:'http://www.google.com', type:'POST', success: function(html){ console.log(html); }); 
najax({ url:'http://www.google.com', type:'POST' }).success(function(resp){}).error(function(err){}); 

najax.get, najax.post, najax.put, najax.delete... 
+1

Esto me llevó a [jajax] (https://npmjs.com/jajax.js) y [djax] (https://npmjs.com/djax) que no tienen dependencias (particularmente lodash voluminosos) haciéndolos más adecuados para los proyectos de navegador. –

+0

Eventualmente terminé sin encontrar un equivalente jQuery.ajax que se adaptara a mis necesidades. 'djax' no es compatible con el manejador' completo', por lo que decidí usar la tecnología futura: https://github.com/github/fetch –

7

También estoy de código compartido entre un navegador y nodejs y también usar jQuery para llamadas Ajax. JQuery requiere una ventana que utilizo desde domino.

actualización:

if (typeof module !== 'undefined' && module.exports) 
{ 
    if (typeof global !== 'undefined' && typeof global.process !== 'undefined' && 
    Object.prototype.toString.call(global.process) === '[object process]') { 
    var domino = require('domino'); 
    var window = domino.createWindow('<html></html>'); 

    var document = window.document; 
    var $ = require('jquery')(window); 
    var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; 
    $.support.cors = true; // cross domain, Cross-origin resource sharing 
    $.ajaxSettings.xhr = function() { 
     return new XMLHttpRequest(); 
    }; 
    } 
} 
+1

¿Por qué está exportando "huepi" cuando no está definido en ninguna parte? – HelpMeStackOverflowMyOnlyHope

+0

Buen punto :). Lo copié de mi proyecto que usa esto. Se llama huepi: https://github.com/arndbrugman/huepi. Lo eliminaré del código de arriba. ¡Thx por notarlo! –

0

Puede utilizar Electron, permite browserjs híbridos y nodejs.

Antes, traté de usar canvas2d en nodejs, pero finalmente me di por vencido. No es compatible con nodejs por defecto, y es muy difícil de instalarlo (muchas muchas ... dependencias). Hasta que uso Electron, puedo usar fácilmente todo mi código anterior de navegador, incluso WebGL, y pasar el valor del resultado (por ejemplo, resultado base64 datos de imagen) al código nodejs.

Cuestiones relacionadas