在Keystone.js API中处理OPTIONS请求

时间:2015-10-16 14:36:53

标签: rest keystonejs

我正在建立一个由Keystone支持的Aurelia SPA。

从我的Aurelia视图发帖时,Content-Type设置为application/json,当然,当来自客户端时会发出OPTIONS请求。

我的Keystone init设置在cors上是开放的,用于本地开发:

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

我对API的Keystone路由绑定是:

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-urlencodedtext/plain,其数据与那些格式匹配,这些格式不会导致OPTIONS请求,但是Keystone没有解析那些内容讯息。

我做错了什么?

1 个答案:

答案 0 :(得分: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;

然后在我的Aurelia应用程序中,我在将其发布到Keystone之前调用JSON.stringify(myObject)。随后在我的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
        });
    });

};