2015-10-16 2 views
2

Я строю SPA с Aurelia, поддерживаемый Keystone.Обработка запроса OPTIONS в API Keystone.js

При проводке с моей точкой зрения Аурелия, то Content-Type устанавливаются в application/json, который, конечно, понесет в OPTIONS запрос при выходе из клиентской стороны.

Мои настройки Keystone инициализации широко открыты на CORS для местного развития:

keystone.init({ 
    ... 
    'cors allow origin': true, 
    'cors allow methods': true, 
    'cors allow headers': true, 
    ... 
}); 

Мои Keystone маршрут привязки для API являются:

exports = module.exports = function(app) { 
    app.all('/api/*', keystone.middleware.cors); 
    app.post('/api/inquiry', keystone.middleware.api, routes.api.inquiries.post); 
}; 

Мой взгляд Keystone API является:

var keystone = require('keystone'), 
    Inquiry = keystone.list('Inquiry'); 

exports.post = function(req, res) { 

    var inquiry = new Inquiry.model({ 
     name: { 
      first: req.body.name.first, 
      last: req.body.name.last 
     }, 
     email: req.body.email, 
     phone: req.body.phone, 
     question: req.body.question 
    }); 

    inquiry.save(function(error) { 
     if (error) { 
      return res.apiError(error); 
     } 

     return res.apiResponse({ 
      'inquiry': inquiry 
     }); 
    }); 

}; 

Проблема, с которой я сталкиваюсь, заключается в том, что запрос OPTIONS 404s вместо возврата 200.

Даже если я вручную обрабатываю запрос OPTIONS и просто возвращаю статус 200, запрос POST не следует запросу OPTIONS. Я неправильно понимаю жизненный цикл запроса OPTIONS?

Я также пробовал передавать разные типы контента, такие как 'application/x-www-form-urlencoded и text/plain с данными, соответствующими этим форматам, которые не вызывают запрос OPTIONS, но Keystone не анализирует содержимое этих POST.

Что я делаю неправильно?

ответ

1

По-видимому, я пропустил деталь в документации Keystone, где вы можете настроить экземпляр Express до, передав его Keystone.

// keystone.js 

var keystone = require('keystone'); 
var express = require('express'); 
var cons = require('consolidate'); 
var nunjucks = require('nunjucks'); 
var bodyParser = require('body-parser'); 
var app = express(); 

app.use(bodyParser.text()); 

keystone.app = app; 

Тогда в моем приложении Аурелия, я называю JSON.stringify(myObject) перед вывешивать его Keystone. Впоследствии в моем представлении Keystone мне просто нужно проанализировать строку обратно на JSON:

exports.post = function(req, res, next) { 

    if (!req.body) { 
     return res.sendStatus(400); 
    } 

    var data = JSON.parse(req.body), 
     inquiry = new Inquiry.model(data); 

    inquiry.save(function(error) { 
     if (error) { 
      return res.apiError(error); 
     } 

     return res.apiResponse({ 
      'inquiry': inquiry 
     }); 
    }); 

}; 
Смежные вопросы