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

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

工作期间,一直在用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供开发使用startHandlerTimerendHandlerTimer, 在使用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 开发经验的更多相关文章

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

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

  2. 简介 – ASP.NET MVC 4 系列

           正所谓好记性不如烂笔头,尤其是技术类书籍在阅读后,时间久了一定会忘记.而重新翻阅整本书也较为低效,遂以博客记录阅读摘要以供日后查阅.本系列文章均摘要自 Wrox 红皮书[ASP.NET ...

  3. 找DEV,欢迎挑战高薪 --方向:互联网金融,地点广州

    http://kaolalicai.cn/#/join 企业文化 加入财略 = 进取!自由!快乐 Get things done,坚持,进取 学习型企业,员工培训,交互学习 人性化管理,气氛和谐,快乐 ...

  4. Concurrent HTTP connections in Node.js

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

  5. RESTful API Design With NodeJS & Restify

    http://code.tutsplus.com/tutorials/restful-api-design-with-nodejs-restify--cms-22637 The RESTful API ...

  6. Web Api 与 Andriod 接口对接开发经验

    最近一直急着在负责弄Asp.Net Web Api 与 Andriod 接口开发的对接工作! 刚听说要用Asp.Net Web Api去跟 Andriod 那端做接口对接工作,自己也是第一次接触Web ...

  7. Asp.Net Web Api 与 Andriod 接口对接开发经验,给小伙伴分享一下!

    最近一直急着在负责弄Asp.Net Web Api 与 Andriod 接口开发的对接工作! 刚听说要用Asp.Net Web Api去跟 Andriod 那端做接口对接工作,自己也是第一次接触Web ...

  8. 12306官方火车票Api接口

    2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...

  9. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

随机推荐

  1. Mybatis批量插入及传参问题

    先看需求:将报文对象Message批量插入分库分表的Oracle数据库中 一般如果直接传入List的话,需要加上parameterType="java.util.List" ,然后 ...

  2. 阅读《C陷阱与缺陷》的知识增量

    版权声明:本文为Focustc原创文章.转载请注明作者及出处. https://blog.csdn.net/caozhankui/article/details/35925939 看完<C陷阱与 ...

  3. ResNet 修改

    https://github.com/tornadomeet/ResNet apache 开源项目 修改如下: 训练模块 import argparse,logging,os import mxnet ...

  4. git fetch 和 git pull 的区别

    Git中从远程的分支获取最新的版本到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge git fetch origin master git log ...

  5. Kali-linux目录加密

    在Kali中提供了一个目录加密工具TrueCrypt.该工具是一款开源的绿色加密卷加密软件,不需要生成任何文件即可在硬盘上建立虚拟磁盘.用户可以按照盘符进行访问,所以虚拟磁盘上的文件都被自动加密,访问 ...

  6. Java获取虚拟机内存和操作系统内存及其线程

    为什么要获取虚拟机内存和操作系统内存呢? 虚拟机内存,这里主要指JVM.为了防止有的时候因为JVM内存问题导致服务器宕机,所以有必要监控JVM的内存.当达到一定值时,通过邮件及时通知,防止线上宕机造成 ...

  7. Linux 系统下Eclipse安装及使用

    Linux 系统下Eclipse安装及使用 我们在搞上层开发的时候,都是在Windows下使用Eclipse,那么如果是Linux应用开发,就必须要在Linux中安装Eclipse,用于C/C++开发 ...

  8. Tag It 一款 Jquery控件,当你在文本框中输入逗号时,自动帮你分隔开相关内容

    Demo地址:http://webspirited.com/tagit/ 使用方法: 除了JQuery脚本外,下面的脚本也是必须的,这些脚本你都可以去GitHub下载:https://github.c ...

  9. react系列教程

    这个系列将从基础语法讲起,把react全家桶都讲到,然后到具体的使用,最后完成后,会写一个完整的demo. 前置要求: 基本的CSS,JS要熟练. 部分ES6语法需要了解.可以参考下面提到的阮一峰老师 ...

  10. WPF几个样式

    其实也是大家学的最多的,网上的. 1.老版360 2.360悬浮窗 不好意思,没有找到悬浮球的图片,随便一个代替了 3.老版迅雷 4.新版360 遗憾的是这个样式没有完整的源代码.只是一个演示和图片代 ...