2015-10-16 87 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 
     }); 
    }); 

};