2017-04-15 6 views
0

私はrestifyで問題が発生しました。私はAPIでgetメソッドしか使用できません。通常、CORSについては問題があるようですが、同じドメインでも使用できません。私は、ローカルホストで同じドメインで動作している間、多少試してみました。同じドメインからでもgetメソッドを受け入れて復元する

しかし、コードを少し修正しても機能しませんでした。また、私はPOST要求のreq.bodyまたはreq.paramsのパラメータを取得できないようです。プリフライトリクエストも使用していません。

'use strict'; 
var restify = require('restify'), 
plugins = require('restify-plugins'), 
config = require('./config.js'), 
personController = require('./routes/person-controller') 


var server = restify.createServer({ 
name: config.name, 
version: config.version, 
}) 


server.use(plugins.jsonBodyParser({ mapParams: true })) 
server.use(plugins.acceptParser(server.acceptable)) 
server.use(plugins.queryParser({ mapParams: true })) 
server.pre(restify.CORS({ 
origins: [ 
    '*' 
], 
headers: [ 
    "authorization", 
    "withcredentials", 
    "x-requested-with", 
    "x-forwarded-for", 
    "x-real-ip", 
    "x-customheader", 
    "user-agent", 
    "keep-alive", 
    "host", 
    "accept", 
    "connection", 
    "upgrade", 
    "content-type", 
    "dnt", 
    "if-modified-since", 
    "cache-control", 
    "Accept-Encoding", 
    "Accept-Language", 
    "User-Agent", 
    "Accept", 
    "DNT", 
    "Connection", 
    "Upgrade-Insecure-Requests", 
    "Cache-Control", 
    "Pragma", 
    "Content-Length", 
    "Content-Type", 
    "Accept-Type" 
], 
methods: ["GET", "POST", "PUT"] 
}) 
) 
server.use(plugins.fullResponse()) 

server.get("/api/values", personController.readAll); 
server.get("/api/values/:id", personController.readOne); 
server.post("/api/values/", personController.createPerson); 
server.put("/api/values/", personController.updatePerson); 
server.del("/api/values/", personController.delPerson); 



server.on('uncaughtException', (req, res, route, err) => { 
log.error(err.stack) 
res.send(err) 
}); 

server.listen(config.port, function() { 

}) 

私はこのように解決したいと思いますが、私ができないのであれば、私はExpressに戻る必要があるかもしれません。

新しい情報: 今は私のFirefoxブラウザを使用すると完全に原油を使うことができます。私はノードアプリケーションをホストするためにサーバーを使用します。このサーバは、nginxを使用してubuntuサーバのディストリビューションを使用している仮想マシンです。しかし、jmeterで正確に同じリクエストを投稿すると、完全な機能にアクセスすることはできません。取得するだけです。ここでは、要求の異なるソースのように思える

Host: 192.168.131.128 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 
Firefox/52.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: sv-SE,sv;q=0.8,en-US;q=0.5,en;q=0.3 
Accept-Encoding: gzip, deflate 
DNT: 1 
Connection: keep-alive 
Upgrade-Insecure-Requests: 1 
Cache-Control: max-age=0, no-cache 
Content-Type: application/json 
Content-Length: 174 
Pragma: no-cache 

は何とかサーバー上の別のCORS設定をトリガー火狐から働く要求があります。

+0

投稿リクエストを投稿できますか?リクエストのコンテンツタイプに 'application/json'を設定しますか?ボディパーサは '.use'で復元できません。 – Gntem

+0

Hey!あなたの早急な返信をありがとう。私はserver.use(plugins.fullResponse())をserver.pre(plugins.fullResponse())に変更しました。これは今、atymastと同じoriginで動作しますが、postmanでは動作しません。私は前にコンテンツタイプのアプリケーションを使用したことを知っていますが、今私はリクエストにパラメータを追加しました! –

答えて

0

下記のクラスを使用してください。

インポートCORSから './path/to/CORS.js';

新しいCORS(サーバー).enableCorsRoutes();

class CORS { 

    constructor(server) { 
     this.server = server; 
    } 

    enableCorsRoutes =() => { 
     this.setCorsCredentialHeaders(); 
     this.getCorsRoutes().forEach((route) => { 
      this.server.opts(route, this.enableCors); 
     }); 
    } 

    enableCors = (req, res) => { 
     const header = req.header('origin'); 
     if (!this.isOriginAllowed(header)) { 
      return res.send(405); 
     } 
     res.setHeader('Access-Control-Allow-Origin', header); 
     res.setHeader('Access-Control-Allow-Headers', this.getAllowedHeaders().join(',')); 
     res.setHeader('Access-Control-Allow-Methods', this.getAllowedMethods().join(',')); 
     res.setHeader('Access-Control-Max-Age', this.getCacheTimeForPreflightRequest()); 
     return res.send(200); 
    } 

    isOriginAllowed = (origin) => { 
     let result = false; 
     this.getAllowedOrigins().forEach((allowedOrigin) => { 
      if (origin.includes(allowedOrigin)) { 
       result = true; 
      } 
     }); 
     return result; 
    } 

    getAllowedHeaders =() => ([ 
     'cache-control', 
     'content-type', 
     'x-signature', 
     'x-test-mode', 
     'x-request-id', 
    ]) 

    getAllowedMethods =() => ([ 
     'OPTIONS', 
     'GET', 
     'POST', 
     'PUT', 
     'DELETE', 
     'PATCH', 
    ]) 

    getAllowedOrigins =() => ([ 
     'example.com', 
     'example.org' 
    ]) 

    getCorsRoutes =() => ([ 
     '/\.*/', 
    ]) 

    getCacheTimeForPreflightRequest =() => { 
     return 864000; // ten days in seconds 
    } 

    setCorsCredentialHeaders =() => { 
     this.server.use((req, res, next) => { 
      res.once('header',() => { 
       let isCorsRoute = false; 
       this.getCorsRoutes().forEach((route) => { 
        if (new RegExp(route).test(req.url)) { 
         isCorsRoute = true; 
        } 
       }); 
       if (isCorsRoute && req.header('origin')) { 
        res.setHeader('Access-Control-Allow-Origin', req.header('origin')); 
        res.setHeader('Access-Control-Allow-Credentials', true); 
       } 
      }); 
      next(); 
     }); 
    } 
} 

export default CORS; 
関連する問題