Spine, node.js(экспресс) и Access-Control-Allow-Origin

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

@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);
});

Но я всегда получаю следующий erro в хроме:

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

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

Ответ 1

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

app.options('/posts', function(req, res){
  console.log("writing headers only");
  res.header("Access-Control-Allow-Origin", "*");
  res.end('');
});

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

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

Это по соображениям безопасности. Если вы делаете что-то, что требует куки файлов, то более вероятно, что вы захотите проверить, что Origin является разрешенным сайтом, чтобы избежать атаки CSRF.

Ответ 2

Это промежуточное программное обеспечение позволит использовать CORS с помощью Express, ключ обнаруживает запрос preflight 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/info/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);