2014-09-10 4 views
1

Я написал очень простой сервер:простой запрос Ajax на локальный сервер 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)

Здесь Javasсript-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". 

Любой человек может объяснить, что я сделал неправильно и, возможно, как это исправить?

Большое спасибо!

ответ

2

Первая ошибка вызвана политикой CORS (Cross Origin Resource Sharing). Во всех браузерах правило, что вы не можете отправить запрос на удаленный сервер в AJAX, кроме текущего сервера, на который был загружен сценарий/страница, если только этот удаленный сервер не разрешает его через заголовок Access-Control-Allow-Origin.

Я предлагаю обслуживать страницу с того же сервера Node.js. Тогда это сработает. Например, когда запрос приходит к корню /, затем подайте файл 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); 
+0

Спасибо за ответ, но как я могу отправить модифицирована index.html в клиент, если, например, содержимое index.html является динамическим и по каждому запросу оно должно быть другим? – Farseer

+0

Пример, который я привел, очень прост. Предполагается, что ваш контент статически хранится в файле. Разумеется, вы можете предоставить динамический контент, который может быть основан на некоторых данных с удаленного сервера, например базы данных или удаленного веб-сервиса. Все, что вам нужно сделать, - это динамически создавать контент. Я предлагаю вам изучить структуру [Express] (http://expressjs.com) Node.js, которая позволяет вам обслуживать [файлы шаблонов] (http://expressjs.com/guide.html#template-engines), где есть являются заполнителями для динамического контента. После подготовки динамического содержимого вы можете передать его движку шаблонов. – Eye

+0

Шаблонный движок + Экспресс корректно отображает ваш динамический контент и обслуживает клиента. – Eye

4

Для преодоления 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); 
+0

, если вам интересно, отметьте это хорошее сообщение http://techslides.com/client-side-javascript-to-node-js, верьте, что вы можете узнать что-то новое от него –