utils 公共库函数
这里提供一些公共的,通用的函数, 或者变量, 应用自身的 ./app/lib/utils.js 建议也在这个上扩展,这样在使用的时候就不用刻意区分函数是哪里实现的,但是要注意函数名别冲突,冲突可能会导致open-rest的功能不正常
callback(promise, callback)
该函数的目的是把一个 promise 和 callback 回调函数给结合起来
Arguments
promise
- 异步执行的 promise 实例callback
- 一个回调函数
intval(value, mode)
将一个变量整型化
Arguments
value
- 要处理的变量mode
- 可选参数,进制, 默认是 10, 即 10 进制
getModules(path, exts, excludes)
根据设置的路径,加载并获取对象
Arguments
path
- 要加载的路径exts
- 可选,Array|String 类型, 匹配的后缀, 例如js
代表要加载 .js 后缀的模块excludes
- 可选,Array|String 类型,要排除的模块,例如:index
代表排除 index.js, index.coffee, index.json 等模块
remoteIp(req)
真实的连接请求端ip,这个ip是建立连接的ip,是不可伪造的
但是这个ip往往不是用户的ip
比如我们的 API 并未直接让用户访问,会通过本机的 nginx 代理一下,那么这个 ip 是 127.0.0.1
Arguments
req
- 请求的 request 对象
clientIp(req)
获取客户端真实ip地址, 这个ip最有可能是用户真实的上网ip
但是这个ip也是最不可信任的,因为很容易伪造
一般请求经过反向代理之类的加速服务用户的ip会放在头信息的 x-forwarded-for/x-real-ip 传递
而头信息是可以随意构造的
Arguments
req
- 请求的 request 对象
realIp(req, proxyIps)
获取可信任的真实ip
这个函数先会判断remoteIp 是否是本地nginx代理的ip,如果是的话就获取头信息的 x-real-ip
所以如果是这种部署方式的话,要记得nginx代理的时候要传递 x-real-ip 过来, 值是与nginx建立连接的ip
nginx 里配置如下
proxy_set_header X-Real-IP $remote_addr;
Arguments
req
- 请求的 request 对象proxyIps
- Array 允许代理的ip地址
注: 判断是否是私有客户端就是通过这个 realIp 来判断的,所以这里 proxyIps 一定要谨慎配置
file2Module(file)
文件名称到moduleName的转换, 例如 team-user => teamUser
我们的约定是文件名多个单词之间是减号(-),代码中的变量等是驼峰式
Arguments
file
- String 文件名称
ucwords(value)
首字符大写, 例如 user => User
Arguments
value
- String 要转换的字符串
nt2space(value)
将字符串里的换行,制表符替换为普通空格
一般用来处理单行文本,比如用户名,email,收货地址等这些用 input 表单收集的字段
同时会被左右两侧空白 trim 掉
例如: 'Restone\tZhao' => 'Restone Zhao'
Arguments
value
- String 要处理的字符串
getToken(req)
获取accessToken
优先级依次为
- req.headers['x-auth-token']
- req.params.access_token
- req.params.accessToken
Arguments
req
- 请求的 request 对象
randStr(len, type)
生成随机字符串
Arguments
len
- Number 生成的随机串的长度type
- String 随机串的强度,可选noraml
,strong
, 默认是normal
如果 type 既不是
noraml
也不是strong
那么会用 type 直接作为生成随机串的字典
logger 对象
info(...args)
调用 console.info 输出信息
error(...args)
调用 console.error 输出信息
warn(...args)
调用 console.warn 输出信息
isTest 常量
用来判断当前是否是测试环境 process.env.NODE_ENV 判断是否是 test
isProd 常量
用来判断当前是否是生产环境 process.env.NODE_ENV 判断是否是 production