Простой запрос ajax на сервер localhost nodejs
Я написал очень простой сервер:
/* Creating server */
var server = http.createServer(function (request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.end("Hello World\n");
});
/*Start listening*/
server.listen(8000);
Я запускаю его с помощью nodejs.
Теперь я хочу написать простой клиент, который использует вызов ajax для отправки запроса на сервер и ответа на печать (Hello World)
Здесь javascript of clinet:
$.ajax({
type: "GET",
url: "http://127.0.0.1:8000/" ,
success: function (data) {
console.log(data.toString);
}
});
Когда я открываю клиентский файл html, я получаю следующую ошибку в консоли:
XMLHttpRequest cannot load http://127.0.0.1:8000/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
Я попытался добавить к ajax-вызову следующее:
$.ajax({
type: "GET",
url: "http://127.0.0.1:8000/" ,
dataType: 'jsonp',
crossDomain: true,
success: function (data) {
console.log(data.toString);
}
});
Но тогда я получаю
Resource interpreted as Script but transferred with MIME type text/plain: "http://127.0.0.1:8000/?callback=jQuery211046317202714271843_1410340033163&_=1410340033164".
Любой может объяснить, что я сделал неправильно, и, возможно, как это исправить?
Большое спасибо!
Ответы
Ответ 1
Первая ошибка вызвана политикой CORS (Cross Origin Resource Sharing). Он управляет всеми браузерами тем, что вы не можете отправить запрос на удаленный сервер в AJAX, кроме текущего сервера, на который была загружена страница script/page, если только этот удаленный сервер не разрешает ее через заголовок Access-Control-Allow-Origin
.
Я предлагаю обслуживать страницу с того же сервера Node.js. Тогда это сработает. Например, когда запрос поступает на страницу root /
, затем подайте файл index.html
, иначе сервер будет любым другим содержимым, которое вы хотите.
var http = require('http'),
fs = require('fs');
/* Creating server */
var server = http.createServer(function (request, response) {
if (request.url == '/' || request.url == '/index.html') {
var fileStream = fs.createReadStream('./index.html');
fileStream.pipe(response);
} else {
response.writeHead(200, {"Content-Type": "text/plain"});
response.end("Hello World\n");
}
});
/*Start listening*/
server.listen(8000);
Ответ 2
Чтобы преодолеть CORS, в файле node.js напишите ниже, основываясь на том, что вам нужно:
// Website you wish to allow to connect
res.setHeader('Access-Control-Allow-Origin', '*');
// Request methods you wish to allow
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
// Request headers you wish to allow
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
res.setHeader('Access-Control-Allow-Credentials', true);