2015-10-16 88 views
2

我正在用Keystone支持的Aurelia构建SPA。在Keystone.js API中处理OPTIONS请求

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

我的梯形校正初始化设置上CORS为当地的发展大开:

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

我对API梯形航线绑定是:

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

我的梯形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不分析这些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; 

然后在我的Aurelia大街的应用程序,我把它张贴到梯形校正之前调用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 
     }); 
    }); 

};