此文已由作者王振华授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

工作期间,一直在用Restify开发或维护大大小小的API系统,现在分享一下一些个人觉得不错的Tips。

充分利用middleware机制

这里的middleware指的就是处理请求过程中一个独立的小函数,众多Node社区的Web框架都采用类似这样的形式 function (req, res, next) {},然后把这些handler函数叠起来组成一个线性模型来完成一次请求的生命周期。

首先,看一下一个Resitfy Api应用的最核心的骨架

let restify = require('restify')let app = restify.createServer()
app.use(restify.plugins.queryParser())
app.use(restify.plugins.bodyParser())
app.get('/api/users/list', listUsers)

这里使用middleware机制加载了两个插件,然后在自己定义的路由上使用自己的listUsers函数来处理,非常简单清晰。

等一下,listUser不一定必须是一个handler函数,事实上可以是一个handler chain(函数的数组)。 基于这个简单的思路,我们能更加优雅的处理一些Web开发中常见的任务。

参数验证

编写API接口时,参数校验是实现API必不可少的一步。通常来说会使用一个validation库来提高日常的体验,  举个例子:

  let saveGiftRecord = [paramsValidator({roleid: Joi.number().integer().required(),friend_id: Joi.number().integer().required(),gift_type: Joi.number().integer().only(giftTypes).required()}),    function saveGiftRecord (req, res, next) {      //DO SOMETHING}]

这里使用Joi来作为validation库,然后使用paramsValidator作为helper函数来生成一个handler函数来提高日常参数校验的体验。另外,由于参数验证作为一个独立函数存在,又获得了额外的增益,方便在不同api的endpoint之间共享。

耗时追踪

Restify对handler函数提供了一组耗时统计的api供开发使用startHandlerTimer,endHandlerTimer, 在使用handlers chain数组的形式传递给路由时,会对所有handler进行耗时记录,在api性能不佳时,有助于分析性能瓶颈

使用自带的插件auditLogger打开

[2017-12-25T22:15:09.488+08:00]  INFO: push-api/61713 on zhenhua.local:  (req_id=a29ad32e-7bf6-4131-8fbf-d630b4af5f34, latency=88)GET /users/followed/list?roleid=101150001 HTTP/1.1 req.timers: {"parseCookies": 226,"parseQueryString": 1792,"readBody": 395,"parseBody": 130,"getAuthByType": 129,"authMiddleware": 4506,"validateParams": 381,"getFollowList": 62657,"getFanCountBatch": 3140,"filterSelfFollowIds": 2182,"filterSelfFanIds": 107,"getRoleInfos": 1736,"formatResult": 640,"sendResponse": 4718}

如图所示,在auditLogger中能看到经过各个handler的耗时,方便定位瓶颈。

这两个API使用了process.hrtime(), 时间精度较高

另外,restify仓库下一个方便组合handler的库conductor也值得关注

网易云免费体验馆,0成本体验20+款云产品!

更多网易技术、产品、运营经验分享请点击。

相关文章:
【推荐】 网易严选的wkwebview测试之路
【推荐】 基于AOP的优惠券发送异常哨兵监控

转载于:https://www.cnblogs.com/163yun/p/9810100.html

Restify Api 开发经验相关推荐

  1. Day 27: Restify —— 在Node.js中构建正确的REST Web服务

    今天决定学一个叫做restify的Node.js模块.restify模块使得在Node.js中写正确的REST API变得容易了很多,而且它还提供了即装即用的支持,如版本控制.错误处理.CORS和内容 ...

  2. Python量化交易平台开发教程系列1-类CTP交易API的工作原理

    原创文章,转载请注明出处:用Python的交易员 类CTP交易API简介 国内程序化交易技术的爆发式发展几乎就是起源于上期技术公司基于CTP柜台推出了交易API,使得用户可以随意开发自己的交易软件直接 ...

  3. Concurrent HTTP connections in Node.js

    原文: https://fullstack-developer.academy/concurrent-http-connections-in-node-js/ -------------------- ...

  4. Google Map 开发笔记——基础篇(Javascript )

    Google Map 开发笔记--基础篇 说明: 一.使用入门: 1.在您需要显示地图的 html 页面嵌入这段 script 2.地图 DOM 元素 3.初始化地图 二.地图画点.线.面 1.标记( ...

  5. WEB前端技能考核内容及岗位要求 送给找工作的童鞋 详细概括

    在找工作的过程中,多多少少都会涉及到个人能力水平,技术技能水平等级.为了应大家的要求,web前端中文站给大家聊一聊web前端这块的工作要求情况.将岗位区分,从主要职责.专业技能.素质能力.特别要求共四 ...

  6. asp身份证识别代码,asp+百度ai实现身份证正反两面识别

    还是昨天那个朋友,让我帮忙写asp实现姓名与身份证的真假查询的那个朋友,今天又让我帮忙写个asp+百度ai实现身份证正反两面识别代码,有了昨天的百度api开发经验后,今天稍作研究就成功了,asp连接百 ...

  7. ASP.NET MVC 5 02 - ASP.NET MVC 1-5 各版本特点

    参考书籍:<ASP.NET MVC 4 高级编程>.<ASP.NET MVC 5 高级编程>.<C#高级编程(第8版)>.<使用ASP.NET MVC开发企业 ...

  8. restify mysql_[菜鸟试水]关于Nodejs搭建后台API服务(Mysql-Restify)[下]

    字数太多,我腰斩一下... 因为是API后台, 没有V只剩MC, 我们先看看Controller吧.也是简单的处理代码. 由require看出,我们需要在JsModule下再建一个文件夹Control ...

  9. [转]Linux 的多线程编程的高效开发经验

    Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断.本文中我们 ...

最新文章

  1. IntelliJ IDEA 小技巧: Stream Trace 功能!
  2. 关于numy中np.expand_dims方法的理解?
  3. php padright,[扩展推荐] PHP 字符串操作类 Twine
  4. Linux新手入门:通过chmod改变文件权限--转
  5. PHP面试题:请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?
  6. 服务器升级中不能修改信息,服务器升级页面
  7. 《标准普通话教程》中对平舌音的发音方法的说明
  8. r语言实现sem_统计基础:【18】使用Excel和R语言来实现抽样
  9. mongoDB高级查询
  10. 动态视频壁纸多功能工具箱微信小程序源码,支持外卖CPS和流量主
  11. 固体火箭发动机三维装药逆向内弹道计算
  12. 几张图,简单弄懂pcb生产工艺流程!
  13. I5 4590 台式机安装黑苹果最新版笔记
  14. Flutter 中文文档:使用 Packages
  15. 易语言大漠圆形椭圆形渐开线结合鼠标特征码刷怪
  16. CDR中实现浮雕效果的两种方法
  17. IDEA license server 地址
  18. TensorFlow入门教程(16)分离歌曲中的人声和背景音乐
  19. 「首席架构师推荐」React生态系统大集合
  20. 华工计算机应用基础》作业,华工_计算机应用基础2015作业

热门文章

  1. MediaElementAudioSourceNode
  2. 华为谷歌安装器 Android6.0,GO谷歌安装器华为
  3. 领导逼走员工的新套路,一次就见效
  4. 芯片业巨震!英特尔拟90亿美元卖掉NAND闪存业务
  5. Nginx学习总结(14)——Nginx配置参数详细说明与整理
  6. java性能瓶颈分析_Java性能优化技巧整理,做一个深度的程序员
  7. 令人期待的php7.4,PHP7.4新特性
  8. Python自动化运维开发----基础(八)字符串
  9. Android中你可能忽略的知识点(1)-分辨率那些事
  10. 一个内存增长问题的分析和处理(二)——valgrind工具的用法