Проблема у вас есть то, что вы пытаетесь сделать запрос на кросс-происхождение и что не допускается браузерами (да, тот же имя хоста с различными подсчетов порта как другой происхождение для этой цели). У вас есть три варианта:
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",
Как я понимаю ваш вопрос, вы загружаете веб-страницу из localhost: 8888, а затем вызывает $ .ajax на localhost: 1337. Это верно? Если да, то вы попадаете в ту же самую политику происхождения. – Barend
Это правильно.Так что единственный способ обойти это - запустить мой сайт с сервера node.js, чтобы он имел тот же порт? Но что, если я буду жить на своем веб-сайте, размещенном на порту 80, и я хочу подключиться к серверу node.js, чтобы сделать запрос, такой как поиск? Как это делают большинство людей? –
Предпочтительный подход (IMHO) заключается в использовании обратного прокси-сервера, чтобы все запросы переходили на один и тот же хост/порт и перенаправляли их за кулисами. Необычным обходным решением является использование JSONP, но мне лично это не нравится из-за его последствий для безопасности. – Barend