Esto es similar a Transmitir datos con Node.js , pero no creo que esa pregunta haya sido respondida lo suficiente.
Estoy tratando de usar una llamada jQuery ajax (get, load, getJSON) para transferir datos entre una página y un servidor node.js. Puedo presionar la dirección desde mi navegador y ver "¡Hola mundo!", pero cuando intento esto desde mi página, falla y muestra que no recibo respuesta. Configuré una página de prueba simple y un ejemplo de hola mundo para probar esto:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>get test</title> </head> <body> <h1>Get Test</h1> <div id="test"></div> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.js"></script> <script> $(document).ready(function() { //alert($('h1').length); $('#test').load('http://192.168.1.103:8124/'); //$.get('http://192.168.1.103:8124/', function(data) { // alert(data); //}); }); </script> </body> </html>y
var http = require('http'); http.createServer(function (req, res) { console.log('request received'); res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(8124);Si su página de prueba simple se encuentra en otro protocolo/dominio/puerto que su ejemplo de hello world node.js, está realizando solicitudes entre dominios y violando la misma política de origen, por lo tanto, sus llamadas jQuery ajax (obtener y cargar) están fallando en silencio. Para que este dominio cruzado funcione, debe usar el formato basado en JSONP . Por ejemplo código node.js:
var http = require('http'); http.createServer(function (req, res) { console.log('request received'); res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('_testcb(\'{"message": "Hello world!"}\')'); }).listen(8124);y el lado del cliente JavaScript/jQuery:
$(document).ready(function() { $.ajax({ url: 'http://192.168.1.103:8124/', dataType: "jsonp", jsonpCallback: "_testcb", cache: false, timeout: 5000, success: function(data) { $("#test").append(data); }, error: function(jqXHR, textStatus, errorThrown) { alert('error ' + textStatus + " " + errorThrown); } }); });También hay otras formas de hacer que esto funcione, por ejemplo, configurando un proxy inverso o creando su aplicación web completamente con un marco como express .
Gracias a yojimbo por su respuesta. Para agregar a su muestra, quería usar el método jquery $.getJSON que coloca una devolución de llamada aleatoria en la cadena de consulta, así que también quería analizar eso en Node.js. También quería devolver un objeto y usar la función stringify.
Este es mi código del lado del cliente.
$.getJSON("http://localhost:8124/dummy?action=dostuff&callback=?", function(data){ alert(data); }, function(jqXHR, textStatus, errorThrown) { alert('error ' + textStatus + " " + errorThrown); });Este es mi lado del servidor Node.js
var http = require('http'); var querystring = require('querystring'); var url = require('url'); http.createServer(function (req, res) { //grab the callback from the query string var pquery = querystring.parse(url.parse(req.url).query); var callback = (pquery.callback ? pquery.callback : ''); //we probably want to send an object back in response to the request var returnObject = {message: "Hello World!"}; var returnObjectString = JSON.stringify(returnObject); //push back the response including the callback shenanigans res.writeHead(200, {'Content-Type': 'text/plain'}); res.end(callback + '(\'' + returnObjectString + '\')'); }).listen(8124);