2017-08-24 8 views
0

公開APIエンドポイントにAPIリクエストを行うバックエンドサービスを作成しています。 APIからの応答はJSONとして送信されます。私はAPI呼び出しを行うためにrequest.jsを使用しています。インスタンスを返すときは、request.Requestを任意のコード(この場合はExpress.jsのルートハンドラ)に返します。ルートハンドラは、APIコールからの応答をルートに要求したクライアントに単に返すだけです。 私は上記のシナリオについては、以下の懸念がありますので、ストリームインタフェースを実装するビジネスロジックを実装するための最良の方法は何、私が直接APIを渡すことができますノード内のミドルウェアパイプライン

  1. は(基本的には、パイプを起動するミドルウェア関数に値を戻しましたメソッドを返し、それをクライアントにストリーミングする前に、さまざまなロジックのミドルウェアを渡します)。

  2. 私は、Expressのすべてのルートハンドラに渡されるExpress.Responseインスタンスが1回だけ消費され、他の関数への引数として渡される場合は複製する必要があることを知っています。このアプローチは、(1)で説明した方法と比較して優れていますか?議論を乱雑に回避するために

、私は(コードは、構文エラーがない、あまりにも正常に動作します)私が上で働いているコードのスニペットを提供しています:

APIConnector.ts:

を明示により奨励パターンの
import * as Request from 'request'; 
export class APIConnector{ 
    // All the methods and properties pertaining to API connection 
    getValueFromEndpoint(): Request.Request{ 
     let uri = 'http://someendpoint.domain.com/public?arg1=val1'; 
     return Request.get(uri); 
    } 
    // Rest of the class 
} 

App.ts

import * as API from './APIConnector'; 
import * as E from 'express'; 

const app = E(); 
const api = new API(); 

app.route('/myendpoint) 
    .get((req: E.Request, res: E.Response) => { 
     api.getValueFromEndpoint().pipe(res); 
     // before .pipe(res), I want to pipe to my middleware 
    }); 

答えて

0

一つとしてミドルウェアを使用することですリクエストオブジェクトのデコレータを使用している場合は、ミドルウェア経由でリクエストにAPIコネクタを追加してから使用します。

app.js

import * as apiConnectorMiddleware from './middleware/api-connector'; 
import * as getRoute from './routes/get-route' 
import * as E from 'express'; 

app.use(apiConnectorMiddleware); 
app.get('/myendpoint', getRoute); 

ミドルウェア/ APIコネクタ

import * as request from 'request-promise' 
(req, res, next) => { 
    req.api = request.get('http://someendpoint.domain.com/public? 
    arg1=val1'); 
    next(); 
} 

ルート/取得ルートを

(req, res) => req.api 
       .then(value => res.send(value)) 
       .catch(res.status(500).send(error)) 
関連する問題