Это похоже на Поток данных с Node.js, но я не чувствую, что на этот вопрос был дан ответ.
Я пытаюсь использовать jQuery ajax call (get, load, getJSON) для передачи данных между страницей и сервером Node.js. Я могу ударить по адресу из моего браузера и увидеть "Hello World!", Но когда я пытаюсь это сделать с моей страницы, он терпит неудачу и показывает, что я не получаю ответа. Я настраиваю простую тестовую страницу и пример приветствия, чтобы проверить это:
<!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>
и
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);
Если ваша простая тестовая страница находится на другом протоколе/домене/порте, чем в вашем мире приветствия node.js, вы делаете междоменные запросы и нарушаете ту же политику происхождения поэтому ваши вызовы jQuery ajax (get и load) терпят неудачу. Чтобы получить этот рабочий кросс-домен, вы должны использовать JSONP формат. Например 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);
и клиентская сторона 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);
}
});
});
Есть и другие способы, как это сделать, например, путем настройки обратного прокси-сервера или полностью создать ваше веб-приложение с помощью фреймворка, такого как express.
Спасибо yojimbo за его ответ. Чтобы добавить к его образцу, я хотел использовать метод jquery $.getJSON, который помещает случайный обратный вызов в строку запроса, поэтому я также хотел разобрать это в Node.js. Я также хотел передать объект обратно и использовать функцию stringify.
Это код моей клиентской стороны.
$.getJSON("http://localhost:8124/dummy?action=dostuff&callback=?",
function(data){
alert(data);
},
function(jqXHR, textStatus, errorThrown) {
alert('error ' + textStatus + " " + errorThrown);
});
Это моя сторона сервера 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);
Предположим, ваша страница html размещена на другом порту. Такая же политика происхождения требует в большинстве браузеров, чтобы загруженный файл находился в том же порту, что и файл загрузки.
На стороне сервера используйте что-то вроде следующего:
http.createServer(function (request, response) {
if (request.headers['x-requested-with'] == 'XMLHttpRequest') {
// handle async request
var u = url.parse(request.url, true); //not needed
response.writeHead(200, {'content-type':'text/json'})
response.end(JSON.stringify(some_array.slice(1, 10))) //send elements 1 to 10
} else {
// handle sync request (by server index.html)
if (request.url == '/') {
response.writeHead(200, {'content-type': 'text/html'})
util.pump(fs.createReadStream('index.html'), response)
}
else
{
// 404 error
}
}
}).listen(31337)