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