Restify Api 开发经验
此文已由作者王振华授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
工作期间,一直在用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+款云产品!
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 用scrapy数据抓取实践
【推荐】 网易云易盾朱浩齐:视听行业步入强监管和智能时代
【推荐】 在一台服务器上搭建相对高可用HiveServer实践
Restify Api 开发经验的更多相关文章
- ASP.NET MVC 5 02 - ASP.NET MVC 1-5 各版本特点
参考书籍:<ASP.NET MVC 4 高级编程>.<ASP.NET MVC 5 高级编程>.<C#高级编程(第8版)>.<使用ASP.NET MVC开发企业 ...
- 简介 – ASP.NET MVC 4 系列
正所谓好记性不如烂笔头,尤其是技术类书籍在阅读后,时间久了一定会忘记.而重新翻阅整本书也较为低效,遂以博客记录阅读摘要以供日后查阅.本系列文章均摘要自 Wrox 红皮书[ASP.NET ...
- 找DEV,欢迎挑战高薪 --方向:互联网金融,地点广州
http://kaolalicai.cn/#/join 企业文化 加入财略 = 进取!自由!快乐 Get things done,坚持,进取 学习型企业,员工培训,交互学习 人性化管理,气氛和谐,快乐 ...
- Concurrent HTTP connections in Node.js
原文: https://fullstack-developer.academy/concurrent-http-connections-in-node-js/ -------------------- ...
- RESTful API Design With NodeJS & Restify
http://code.tutsplus.com/tutorials/restful-api-design-with-nodejs-restify--cms-22637 The RESTful API ...
- Web Api 与 Andriod 接口对接开发经验
最近一直急着在负责弄Asp.Net Web Api 与 Andriod 接口开发的对接工作! 刚听说要用Asp.Net Web Api去跟 Andriod 那端做接口对接工作,自己也是第一次接触Web ...
- Asp.Net Web Api 与 Andriod 接口对接开发经验,给小伙伴分享一下!
最近一直急着在负责弄Asp.Net Web Api 与 Andriod 接口开发的对接工作! 刚听说要用Asp.Net Web Api去跟 Andriod 那端做接口对接工作,自己也是第一次接触Web ...
- 12306官方火车票Api接口
2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...
- Docker容器环境下ASP.NET Core Web API应用程序的调试
本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...
随机推荐
- BZOJ1009:[HNOI2008]GT考试(AC自动机,矩乘DP)
Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0< ...
- [19/03/29-星期五] IO技术_File(文件)类(可操作文件,不能操作其里边内容,位于Java.io 包中)&递归遍历
一.概念 java.io.File类:代表文件和目录. 在开发中,读取文件.生成文件.删除文件.修改文件的属性时经常会用到本类. 以pathname为路径创建File对象,如果pathname是相对路 ...
- docker-3-常用命令(上)
帮助命令: docker version docker info docker --help 镜像命令: docker images: 列出本地主机上的镜像 各个选项说明: ...
- xtrabackup2.4选项参考
该xtrabackup2.4选项参考¶ 此页面记录了xtrabackup二进制文件的所有命令行选项 . 选项 --apply-log-only 此选项仅在准备备份时执行重做阶段.这对增量备份非常重要. ...
- 阅读layim代码小记,监听事件实现方法
(function (win) { //注册事件 var chat = function () { $('#open').on('click', function () { sendMessage() ...
- springAOP(Aspect)权限访问页面
1.XML进行配置切面 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h ...
- github commit 报错:error: failed to push some refs to 'https:'错误解决方法
为什么会出现这个问题呢? 因为我在github中删除了一个文件readme.txt,但是本地并不知道我删除了readme.txt,本地中还保存了readme.txt文件,导致了云端的文件,和本地的文件 ...
- javascript实现jsonp跨域问题+原理
在工作中往往存在跨域的问题 ,跨域是什么概念就不在这里了,搜这类问题的肯定已经知道了.下面直接探讨jsonp跨域原理 jspon跨域原理: 1.动态创建一个script标签 var script = ...
- HTML中IMG标签总结
一.Img标签有两个重要的属性: 1.src 属性:图片的地址 2.alt 属性:图片不显示是现实的文字 二.Img标签是行级元素: img.input属于行内替换元素.height/width/ ...
- python3爬取全站美眉图片
爬取网站:https://www.169tp.com/xingganmeinv 该网站美眉图片有数百页,每页24张,共上万张图片,全部爬取下来 import urllib.request import ...