Nodejs中的中间件流水线

时间:2017-08-24 07:41:14

标签: node.js typescript middleware pipeline node-streams

我正在编写一个向公共API端点发出API请求的后端服务。 API的响应以JSON格式发送。我使用request.js进行API调用,并返回实例,request.Request到任何代码(在本例中,是Express.js中的路由处理程序)。路由处理程序简单地将来自API调用的响应“管道”回给请求路由的客户端。 关于上述情况,我有以下问题:

  1. 实现Stream接口实现业务逻辑的最佳方法是什么,我可以直接将API返回值传递给中间件函数(基本上,在返回值上调用管道方法,并传递各种中间件)在将其流式传输到客户端之前的逻辑)?

  2. 我知道传递给Express中每个路由处理程序的Express.Response实例只被消耗一次,如果它们作为参数传递给其他函数,则必须重复。与(1)中描述的方法相比,这种方法更好吗?

  3. 为了避免讨论混乱,我提供了我正在处理的代码片段(代码没有语法错误,也正常运行):

    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
        });
    

1 个答案:

答案 0 :(得分:1)

express所鼓励的模式之一是使用中间件作为请求对象的装饰器,在您的情况下,您将在路由中使用api连接器之前通过中间件添加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))