2012-04-22 3 views
3

Я играл с node.js, а затем наткнулся на экспресс-фреймворк. Кажется, я не могу заставить его работать, когда используются разные порты.node.js, express и различные порты

У меня есть мой ajax на http://localhost:8888, который является сервером MAMP. Я бегу на своем Mac.

$.ajax({ 
    url: "http://localhost:1337/", 
    type: "GET", 
    dataType: "json", 
    data: { }, 
    contentType: "application/json", 
    cache: false, 
    timeout: 5000, 
    success: function(data) { 
     alert(data); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     alert('error ' + textStatus + " " + errorThrown); 
    } 
}); 

Как вы можете видеть, что мой node.js сервер работает на http://localhost:1337/. В результате ничего не возвращается, и это порождает ошибку.

Есть ли способ обойти это?

Благодаря

Бен

+1

Как я понимаю ваш вопрос, вы загружаете веб-страницу из localhost: 8888, а затем вызывает $ .ajax на localhost: 1337. Это верно? Если да, то вы попадаете в ту же самую политику происхождения. – Barend

+0

Это правильно.Так что единственный способ обойти это - запустить мой сайт с сервера node.js, чтобы он имел тот же порт? Но что, если я буду жить на своем веб-сайте, размещенном на порту 80, и я хочу подключиться к серверу node.js, чтобы сделать запрос, такой как поиск? Как это делают большинство людей? –

+1

Предпочтительный подход (IMHO) заключается в использовании обратного прокси-сервера, чтобы все запросы переходили на один и тот же хост/порт и перенаправляли их за кулисами. Необычным обходным решением является использование JSONP, но мне лично это не нравится из-за его последствий для безопасности. – Barend

ответ

4

Проблема у вас есть то, что вы пытаетесь сделать запрос на кросс-происхождение и что не допускается браузерами (да, тот же имя хоста с различными подсчетов порта как другой происхождение для этой цели). У вас есть три варианта:

1. Прокси-запрос.

Сделайте это, если сможете. Напишите код, который запускается на сервере: 8888 , который запрашивает прокси-сервер 1337. Вы также можете сделать это торчащий прокси перед ними обоими, что-то вроде Nginx является довольно хорошо на этом и легко настроить

2. Используйте CORS (Cross Origin Resource Sharing)

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing и https://developer.mozilla.org/en/http_access_control

Это означает добавление некоторых заголовков в ваши ответы, чтобы сообщить обозревателю, что запросы кросс-происхождения здесь одобрены. В вашем сервере Экспресс добавить промежуточное программное обеспечение, как это:

function enableCORSMiddleware (req,res,next) { 
    // You could use * instead of the url below to allow any origin, 
    // but be careful, you're opening yourself up to all sorts of things! 
    res.setHeader('Access-Control-Allow-Origin', "http://localhost:8888"); 
    next() 
    } 
server.use(enableCORSMiddleware); 

3. Использование JSONP

Это трюк, где вы закодировать ваш ответ «Аякса» в качестве Javascript кода. Затем вы запрашиваете у браузера загрузку этого кода, браузер будет с радостью загружать скрипты с перекрестным происхождением, чтобы это обошло проблему с перекрестным происхождением. Это также позволяет кому-то еще обойти его, хотя, так что будьте уверены, это то, что вы хотите!

На стороне сервера вам нужно обернуть ваш ответ в вызове функции Javascript, экспресс может сделать это для автоматически, если вы включите опцию «JSONP обратного вызова», как это:

server.enable("jsonp callback"); 

Затем отправить свой ответ, используя "JSON()" метод ответа:

server.get("/ajax", function(req, res) { 
    res.json({foo: "bar"}); 
}); 

на стороне клиента вы можете enanble JSONP в JQuery, просто изменив "JSON" в "JSONP" в опции DATATYPE:

dataType: "jsonp",