Rest 在Keystone.js API中处理选项请求

Rest 在Keystone.js API中处理选项请求,rest,keystonejs,Rest,Keystonejs,我在建一个温泉浴场,奥雷莉亚在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(); ap

我在建一个温泉浴场,奥雷莉亚在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;
从my Aurelia视图发布时,
内容类型
设置为
application/json
,当然,从客户端发出
选项
请求

我的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
        });
    });

};
我遇到的问题是,选项请求404而不是返回200

即使我手动处理OPTIONS请求并返回状态200,POST请求也不会跟随OPTIONS请求。我是否误解了选项请求生命周期

我还尝试过传递不同的内容类型,比如
'application/x-www-form-urlencoded
text/plain
,其中的数据与这些格式匹配,这不会导致选项请求,但Keystone不会解析这些帖子的内容


我做错了什么?

显然我错过了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
        });
    });

};