Вопрос по javascript, node.js, ajax, jquery – spine, node.js (экспресс) и Access-Control-Allow-Origin

11

Я разрабатываю приложение на своем локальном компьютере. Внешний интерфейс должен быть построен с помощью spinejs, а backend-api - с помощью node.js. Spine работает на порту 9294, а node.js работает на порту 3000. в позвоночнике я добавил к своей модели следующее:

@url: "http:localhost:3000/posts"

и в моем экспресс-сервере

app.get('/posts', function(req, res){
  console.log("giving ALL the posts");
  res.header("Access-Control-Allow-Origin", "*")
  res.json(posts);
});

Но я всегда получаю следующую ошибку в Chrome:

XMLHttpRequest cannot load http://localhost:3000/posts. Origin http://localhost:9294 is not allowed by Access-Control-Allow-Origin.

Что я должен сделать, чтобы получить доступ к своему API должным образом? Хотя добавление заголовка в ответах решает проблему.

честно говоря, мой запрос никогда не достигает моего сервера node.js. Я добавил отладочную инструкцию в app.get () ДО того, как что-либо будет отправлено клиенту. При доступе к моему API непосредственно через URL, я вижу заявление, но не при доступе через позвоночник soupdiver
Вы проверили заголовок ответа, чтобы убедиться, что заголовок действительно установлен? Также jQuery использует «OPTIONS». HTTP-команда для определения предварительной авторизации; убедитесь, что экспресс отвечает и на этот HTTP-глагол tkone
Вы должны использовать что-то вроде Чарльза, чтобы убедиться, что это происходит. Здесь мы делаем кучу вещей из x-домена, и это расстраивает, пока вы не увидите, что заголовок ISN установлен. tkone

Ваш Ответ

2   ответа
16

app.get будет отвечать только наGET Запросы. Если браузер предварительно просматривает его сOPTIONS запрос, экспресс отправит ошибку, потому что у него нет прослушивателей для этих запросов. Попробуйте добавить этот код в дополнение к вашему и посмотрите, работает ли он:

  console.log("writing headers only");
  res.header("Access-Control-Allow-Origin", "*");
  res.end('');
});

Также обратите внимание: если вы отправляете куки с запросом (withcredentials=true), тоAccess-Control-Allow-Origin заголовок не может быть*, это должно быть точное значение вOrigin заголовок, который браузер автоматически добавляет к запросу ajax, например:

res.header("Access-Control-Allow-Origin", req.headers.origin);

Это делается из соображений безопасности: если вы делаете что-то, требующее использования файлов cookie, более вероятно, что вы захотите проверить, чтоorigin это разрешенный сайт, чтобы избежатьCSRF-атаки.

Спасибо приятель! У меня не было метода OPTIONS на экране .... работает сейчас :) soupdiver
15

ключ обнаруживает предполётный запросOPTIONS и возвращают ответ, чтобы избежать 404 или дублирующих запросов к базе данных. Смотрите ресурс:http://cuppster.com/2012/04/10/cors-middleware-for-node-js-and-express/

var methodOverride = require('method-override');
app.use(methodOverride());

// ## CORS middleware
// see: http://stackoverflow.com/questions/7067966/how-to-allow-cors-in-express-nodejs
var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');

    // intercept OPTIONS method
    if ('OPTIONS' == req.method) {
      res.send(200);
    }
    else {
      next();
    }
};
app.use(allowCrossDomain);
Наконец, тот, который действительно работает! Спасибо!
Начиная с версии 4 methodOverride больше не связан с Express, поэтому вам нужно будет включить «метод-переопределение» в вашем package.json, то вместоapp.use(express.methodOverride())использоватьvar methodOverride = require('method-override'); app.use(methodOverride());

Похожие вопросы