2016-07-30 11 views
1

CORSをサポートしていないサードパーティのJSONエンドポイントを使用しています。私は今日これを数時間研究し、簡単な解決策(複雑なものもいくつかあります)を見ていません。Meteor JS Node serverを使用してサードパーティのajaxリクエストをプロキシする方法

基本的には、request('http://localhost:3000/publications/jsonProxy')のようなものを実行する必要があります。これはMeteorサーバーを呼び出します。次に、第三者のデータに安全なトークンを要求するパブリケーションが必要です。そのデータをブラウザに返す必要があります。その後

const request = require('request'); 

if (Meteor.isServer) { 
    Meteor.publish('jsonProxy', function jsonProxyPublication() { 
    var options = { 
     url: 'https://somewhere.com/api/endpoint', 
     headers: { 
     'API-Key': '123' 
     } 
    }; 

    function callback(error, response, body) { 
     if (!error && response.statusCode == 200) { 
     let info = JSON.parse(body); 
     console.log(info); 
     return info 
     } else { 
     console.error(error, response) 
     } 
    } 

    request(options, callback); 

    return this.ready() 
    }); 
} 

curl localhost:3000/publications/jsonProxy

私のような何かをしようとしました。これはこれを行う正しい方法に近いものではないかもしれませんが、私は一種の迷子です。

誰も私にこのデータをブラウザに戻す正しい方法を教えてもらえますか?

+0

更新 - 私はそれを理解してすぐに投稿します – BradGreens

答えて

1

私はそれが働いているように見えます。私は文脈からそれを抽出しなければならなかったので、 "実"コードではなく、以下の例のコード。

/server/proxy/json-api.js

import { Meteor } from 'meteor/meteor'; 
import { HTTP } from 'meteor/http' 

Meteor.methods({ 
    'jsonProxy'() { 
    const apiUrl = 'https://api.com/api' 

    const response = HTTP.get(apiUrl, { 
     headers: { 
     'API-Key': '123' 
     } 
    }).data 

    console.log(`${ apiUrl } response:`, response) 

    return response 
    } 
}) 

/server/main.js

import './proxy/jsonodds.js' 

/輸入/ UI /ページ/アプリ/アプリ。 js

Meteor.call('jsonProxy', (error, result) => { 
    if(!error) { 
    Session.set('jsonData', result) 

    } else { 
    Session.set('jsonData', `Error: ${ JSON.stringify(error) } `) 
    } 
} ) 

Template.app.helpers({ 
    jsonData() { 
    return Session.get('jsonData') 
    } 
}) 

/imports/ui/pages/app/app.html

<template name="app"> 
    <div id="app"> 
    {{#each jsonData}} 
     {{> itemTemplate}} 
    {{/each}} 
    </div> 
</template> 

<template name="itemTemplate"> 
    <p>{{displayName}}</p> 
</template> 

編集:プロキシがserverフォルダ内にある重要な場合、私はわからないんだけど、ちょっとそれは働いていると私はへのより多くの事を持っていますビルド。

+0

[解決策](https://stackoverflow.com/a/45957165/1177832) 'WebApp'モジュールを使用してサーバルートを定義する方がはるかにクリーンです。 – danwild

関連する問題