Rest 在Keystone.js API中处理选项请求
我在建一个温泉浴场,奥雷莉亚在Keystone的支持下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.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
});
});
};