云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

云数据库_腾讯云协作_评分榜

小七 141 0

使用Typescript+Workers的加密货币API网关

如果您遵循了第一部分,我有一个环境设置,在这里我可以编写带有测试的Typescript,并使用npm run upload部署到Cloudflare边缘。在这篇文章中,我想进一步了解工人的食谱。我将构建一个小型HTTP请求路由和处理框架,然后使用它构建一个到多个加密货币API提供者的网关。我想说的是,在一个没有依赖关系的文件中,您可以快速构建非常复杂的逻辑,并快速轻松地部署到边缘。此外,使用带有async/await的现代Typescript和丰富的类型结构,还可以编写干净的异步代码。好吧,我们开始。。。我的API将如下所示:动词路径说明得到/api/ping检查工人起床了得到/api/all/spot/:符号聚合来自所有配置网关的响应得到/api/种族/地点/:符号返回响应最快的提供程序的响应得到/api/direct/:exchange/spot/:symbol将请求传递到网关。E、 g.gdax或bitfinex框架好的,这是Typescript,我有接口,我要用它们。以下是我的超迷你http路由框架定义:导出接口IRouter{route(req:RequestContextBase):IRouteHandler;}/***路线*/导出接口IRoute{match(req:RequestContextBase):IRouteHandler | null;}/***处理请求。*/导出接口IRouteHandler{句柄(req:RequestContextBase):Promise;}/***附加便利属性的请求*/导出类RequestContextBase{公共静态fromString(str:string){返回new RequestContextBase(new Request(str));}公共url:url;构造函数(公共请求:请求){此.url=新URL(请求.url);}}所以基本上所有的请求都会发送到IRouter。如果它找到一个返回IRouterHandler的IRoute,那么它将调用它并传入RequestContextBase,这只是为了方便起见而使用解析过的URL的请求。我停止了依赖注入,下面是我们实现的4条路由的路由器实现(Ping、Race、All和Direct)。每个路由对应于我在上面API中定义的四个操作之一,并返回相应的IRouteHandler。导出类路由器实现IRouter{公共路线:IRoute[];构造函数(){这是路线= [新建PingRoute(),新建RaceRoute(),新建AllRoute(),新建DirectRoute(),];}公共异步句柄(request:request):Promise{试试看{const req=new RequestContextBase(请求);常量处理程序=这个路线(要求);返回处理程序.句柄(要求);}接球(e){返回新响应(未定义{状态:500,状态文本:`Error。${e.message}`,});}}公共路由(req:RequestContextBase):IRouteHandler{常量处理程序:IRouteHandler | null=这个。匹配(要求);if(处理程序){logger.debug(`找到的处理程序${req.url.路径名}`);返回处理程序;}返回新的NotFoundHandler();}公共匹配(req:RequestContextBase):iroutHandler | null{for(const route of这是路线) {常量处理程序=路线.匹配(要求);如果(处理者!=空){返回处理程序;}}返回空值;}}上面可以看到,如果找不到匹配的路由,我将返回一个NotFoundHandler。其实施情况如下。很容易看出401405500和所有常见的处理程序是如何实现的。/***404未找到*/导出类NotFoundHandler实现IRouteHandler{公共异步句柄(req:RequestContextBase):Promise{返回新响应(未定义{状态:404,Unknown route:'未知文本',});}}现在让我们从Ping开始。该框架将匹配路由和处理请求分开。首先是路线:导出类PingRoute实现IRoute{公共匹配(req:RequestContextBase):iroutHandler | null{如果(请求方法!=='获取'){返回新MethodNotAllowedHandler();}如果(req.url.路径名.startsWith('/api/ping')){返回新的PingRouteHandler();}返回空值;}}很简单,如果URL以/api/ping开头,则使用PingRouteHandler处理请求导出类PingRouteHandler实现IRouteHandler{公共异步句柄(req:RequestContextBase):Promise{const pong='pong;';const res=新响应(pong);记录器信息(`Responding with${pong}和${资源状态}`);返回新响应(pong);}}因此,在这一点上,如果您遵循第1部分,您可以:$npm运行上传$卷曲https://cryptoservicework.com/api/ping乒乓球好的,接下来是AllHandler,这将聚合响应。首先路由匹配器:导出类AllRoute实现IRoute{公共匹配(req:RequestContextBase):iroutHandler | null{如果(req.url.路径名.startsWith('/api/all/'){返回new AllHandler();}返回空值;}}如果路径匹配,我们将通过向下游处理程序转发请求来处理它:导出类AllHandler实现IRouteHandler{构造函数(私有只读处理程序:IRouteHandler[]=[]){如果(处理程序.长度==0){const factory=新的HandlerFactory();logger.debug('没有处理人员,从工厂得到');this.处理程序= factory.getProviderHandlers();}}公共异步句柄(req:RequestContextBase):Promise{const responses=等待答应。全部(this.handlers.map(异步h=>h.handle(req)));const jsonArr=等待答应。全部(响应.map(async r=>r.json());返回新响应(JSON.stringify(jsonArr));}}我在这里有点作弊,因为我没有向您展示HandlerFactory的代码或每个handle的实现。你可以在这里查找全部资料。花点时间来欣赏一下发生的一切。您正在编写非常有表现力的异步代码,在几行代码中,可以将请求多路传输到多个端点并聚合结果。此外,它运行在一个沙盒环境中,在一个离最终用户非常近的数据中心中。边缘代码是游戏规则的改变者。让我们看看它的行动。$卷曲https://cryptoserviceworker.com/api/all/spot/btc-usd[{"symbol":"btc美元","price":"6609.06000000","utcTime":"2018-06-20T05:26:19.512000Z","提供商":"gdax"},{"symbol":"btc美元","price":"6600.7","utcTime":"2018-06-20T05:26:22.284Z","provider":"bitfinex"}]酷,好吧,谁跑得最快?首先,路由处理程序:导出类raceloute实现IRoute{公共匹配(req:RequestContextBase):iroutHandler | null{如果(req.url.路径名.startsWith('/api/race/'){返回新的RaceHandler();}返回空值;}}以及处理者。基本上就是用承诺。比赛选出赢家导出类RaceHandler实现IRouteHandler{构造函数(私有只读处理程序:IRouteHandler[]=[]){const factory=新的HandlerFactory();this.处理程序= factory.getProviderHandlers();}公共句柄(req:RequestContextBase):Promise{返回这是比赛(要求,this.处理程序);}公共异步竞争(req:RequestContextBase,响应程序:IRouteHandler[]):承诺{常数arr=响应者.map(r=>r.handle(req));返回承诺。比赛(arr);}}那么谁跑得最快?今晚是gdax。卷曲https://cryptoserviceworker.com/api/race/spot/btc-usd{"symbol":"btc美元","price":"6607.15000000","utcTime":"2018-06-20T05:33:16.074000Z","提供商":"gdax"}摘要使用Typescript+Workers,在少于500行代码中,我们能够为小型HTTP路由和处理框架定义接口实现该框架的基本实现构建路由和处理程序以提供Ping、All、Race和Direct处理程序使用npm run upload将其部署到160多个数据中心请继续关注更多,并欢迎PRs,特别是对于更多的提供商。如果您希望与其他Cloudflare用户共享工作人员,或者想查看其他Cloudflare用户的工作人员,请访问Cloudflare社区论坛的workers部分中的"配方交换"。