我正在建立一个由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-urlencoded
和text/plain
,其数据与那些格式匹配,这些格式不会导致OPTIONS请求,但是Keystone没有解析那些内容讯息。
我做错了什么?
答案 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
});
});
};