文档章节

NodeJs Resify请求参数验证

木头释然
 木头释然
发布于 2018/07/09 14:27
字数 676
阅读 175
收藏 0

    在使用restify实现webapi时常常会遇到获取和验证请求参数的问题,与.NET、JAVA等编程语言有确定类型不同,JavaScript这类脚本语言输入参数并没有明确的类型,如果获取失败会返回undefined,当输入参数有多个字段时,单纯依靠传统判断方式不仅麻烦而且容易遗漏不容易维护,故而将验证流程统一成为可复用方法是比较好的选择。

    首先需要定义输入参数的范围,即输入参数的格式。一般情况下,我们采用application/json格式。以用户注册为例,以下罗列一些用户注册时的参数:

const defaultParams = {
  username: {
    type: 'string',
    required: true,
  }, // 用户名
  password: {
    type: 'string', allowNull: true,
  }, // 密码MD5格式
  mobile: { type: 'string', allowNull: true }, // 手机号
  email: { type: 'string', allowNull: true }, // 邮箱
  gender: {
    type: 'int',
    allowNull: true,
    validate: src => [0, 1, 2].indexOf(src) >= 0,
  }, // 性别(0-未知,1-男,2-女)
  birthday: { type: 'datetime', allowNull: true }, // 生日
  zipcode: { type: 'string', allowNull: true }, // 邮编
  nickname: { type: 'string', allowNull: true } // 昵称
};

    其中type字段类型,allowNull是否允许字段缺失,required是否必要,validate验证条件。下面就要从post数据体内获取需要的数据。

const getParams = (params, defaultParams) => {
  const result = {};
  const keys = Object.keys(defaultParams);
  for (let i = 0, len = keys.length; i < len; i += 1) {
    result[keys[i]] = typeof params[keys[i]] === 'string' ? params[keys[i]].trim() : params[keys[i]];
  }
  return result;
};

    获取数据后就可以进行验证了,我们可以对于不同的数据类型进行统一的处理。

const validate = {
  string: src => (typeof src === 'string'),
  int: src => (typeof src === 'number' && src % 1 === 0),
  float: src => (typeof src === 'number'),
  datetime: (src) => {
    const time = moment(src, dateFormat);
    const result = validate.string(src)
      && time.isValid()
      && time.format(dateFormat).split(' ').join('') === src.split(' ').join('');
    return result;
  },
  mobile: (src) => {
    const reg = /^1[3|4|5|7|8][0-9]{9}$/;
    const result = validate.string(src) && reg.test(src);
    return result;
  },
  email: src => (validate.string(src) && validator.isEmail(src)),
};

 


const validateParams = (params, paramsTemplate) => {
  let errCode = rtCode.paramsErr;
  const keys = Object.keys(paramsTemplate);
  for (let i = 0, len = keys.length; i < len; i += 1) {
    if (paramsTemplate[keys[i]].required) {
      if (params[keys[i]] === undefined || params[keys[i]] === null) {
        return { errCode: rtCode.dataLost, msg: `${keys[i]} is required.` };
      }
      if (params[keys[i]] === '') {
        errCode = paramsTemplate[keys[i]].errCode || rtCode.paramsErr;
        return { errCode, msg: `${keys[i]} can't be empty string.` };
      }
    }
    if (params[keys[i]] !== undefined) {
      if (
        !(paramsTemplate[keys[i]].allowNull && params[keys[i]] === null)
        && !validate[paramsTemplate[keys[i]].type](params[keys[i]])
      ) {
        return { errCode, msg: `${keys[i]} must is ${paramsTemplate[keys[i]].type}.` };
      }
      if (
        !(paramsTemplate[keys[i]].allowNull && params[keys[i]] === null)
        && paramsTemplate[keys[i]].validate
        && !paramsTemplate[keys[i]].validate(params[keys[i]])
      ) {
        errCode = paramsTemplate[keys[i]].errCode || rtCode.paramsErr;
        return { errCode, msg: `${keys[i]} is not match.` };
      }
    }
  }
  return { errCode: rtCode.success };
};

    好了,以上就完成所有的验证步骤了。

© 著作权归作者所有

木头释然
粉丝 18
博文 9
码字总数 5035
作品 0
西青
其他
私信 提问
用 Redis 处理 jsonwebtoken 生成的 Token

作者好牛逼啊,我不懂的他全都懂。 [Use Redis to revoke Tokens generated from jsonwebtoken][1] 在[前面][2]一篇文章中,我讲述了怎么用 AngularJS 和 NodeJS 通过 jsonwebtoken 做用户验...

开源中国匿名会员
2014/06/19
10.1K
2
nodejs实现微信公众平台开发

基本原理   用nodejs怎样来实现对微信公众平台的开发呢?   别的就不多说了,先来简单介绍微信公众平台的基本原理。   微信服务器就相当于一个转发服务器,终端(手机、Pad等)发起请求...

笔阁
2016/03/07
4.8K
3
[译] 化 Markdown 为 HTML:用 Node.js 和 Express 搭建接口

原文地址:Building A Node.js Express API To Convert Markdown To HTML 原文作者:Sameer Borate 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:Baddyo 校对者:f...

👊Badd
05/16
0
0
【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--目录(8/8 完结)

为什么要做这个 在使用nodejs开发过程中,总是发现需要做很多重复性的体力劳动,且因为自身是服务端程序员出身,感觉有一些服务端好的东西其实可以在nodejs上得到应用并能提高一些开发工作效...

czd890
2018/07/26
0
0
NodeJS框架express的途径映射(路由)功能及控制

NodeJS框架express的路径映射(路由)功能及控制 我们知道Express是一个基于NodeJS的非常优秀的服务端开发框架,本篇CSSer将提供express框架的route和route control章节,route实现了客户端请...

maweitao
2014/09/05
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

家庭作业——苗钰婷

2 编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound, Sally shouted, "By the Great Pumpkin, what was that! #include<stdio.h>int main(){......

OSC_Okruuv
26分钟前
5
0
经典系统设计面试题解析:如何设计TinyURL(一)

原文链接: https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
27分钟前
3
0
2.面向对象设计原则(7条)

开闭原则 开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 实现方法 可以通过“抽象约束、封装变化”来实...

Eappo_Geng
30分钟前
7
0
8086汇编基础 debug P命令 一步完成loop循环

    IDE : Masm for Windows 集成实验环境 2015     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   ......

志成就
34分钟前
5
0
使用nodeJS实现前端项目自动化之项目构建和文件合并

本文转载于:专业的前端网站➜使用nodeJS实现前端项目自动化之项目构建和文件合并 前面的话   一般地,我们使用构建工具来完成项目的自动化操作。本文主要介绍如何使用nodeJS来实现简单的项...

前端老手
47分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部