-

云函数经常需要处理一些非常基础事情,比如时间、数组、数字、对象、字符串、IP等,自己造轮子的成本很高,这时候我们可以到前面提到的awesome nodejs的Github里去找一些别人已经写好的开源模块,我们直接下载引入即可,下面就列举一些比较好用的工具并会结合云函数给出一些详细的案例。

一、moment时间处理和Timezone世界时间

1、云函数时间处理

开发小程序时经常需要格式化时间、处理相对时间、日历时间以及时间的多语言问题,这个时候就可以使用比较流行的momentjs了,可以参考moment中文文档

使用开发者工具新建一个云函数,比如moment,然后在package.json增加moment最新版latest的依赖:

"dependencies": {
  "wx-server-sdk": "latest",
  "moment": "latest"
}

在index.js里的代码修改为如下,我们将moment区域设置为中国,将时间格式化为 十二月 23日 2019, 4:13:29 下午的样式以及相对当前时间多少分钟前

const cloud = require('wx-server-sdk')
const moment = require("moment");
cloud.init({
    env: cloud.DYNAMIC_CURRENT_ENV,
  })
exports.main = async (event, context) => {
    moment.locale('zh-cn');
    time1 = moment().format('MMMM Do YYYY, h:mm:ss a');
    time2 = moment().startOf('hour').fromNow();
    return  { time1,time2}
}

>值得注意的是,云函数中的时区为 UTC+0,不是 UTC+8,格式化得到的时间和在国内的时间是有8个小时的时间差的,如果在云函数端将时间格式转换为字符串需要给小时数+8(这个处理需要注意一些细节,不会处理的建议修改时区),也可以修改时区。

2、函数处理时区的两个方法

云函数修改时区我们可以使用timezone依赖(和moment是同一个开源作者),timezone技术文档

在package.json增加moment-timezone最新版latest的依赖,然后修改上面相应的代码即可,

"dependencies": {
  "wx-server-sdk": "latest",
  "moment-timezone": "latest"
}

然后使用在云函数里使用如下代码,即可完成时区的转换。

const moment = require('moment-timezone');
time1 = moment().tz('Asia/Shanghai').format('MMMM Do YYYY, h:mm:ss a');

云函数的时区除了可以使用moment来处理外,还可以通过配置云函数的环境变量的方法(在云开发控制台),添加一个字段 TZ,值为Asia/Shanghai来指定时区即可。

二、获取公网IP

有时我们希望能够获取到服务器的公网IP,比如用于IP地址的白名单,或者想根据IP查询到服务器所在的地址,ipify就是一个免费好用的依赖,通过它我们也可以获取到云函数所在服务器的公网IP,ipify Github地址

使用开发者工具新建一个getip的云函数,然后输入以下代码,并在package.json的”dependencies”里增加最新版的ipify依赖:

"dependencies": {
  "wx-server-sdk": "latest",
  "ipify": "latest"
}

在index.js里的代码修改为如下,调用ipify返回ipv4的服务器地址:

const cloud = require('wx-server-sdk')
const ipify = require('ipify');
cloud.init({
    env: cloud.DYNAMIC_CURRENT_ENV,
})
exports.main = async (event, context) => {
    return await ipify({ useIPv6: false })
}

然后右键getip云函数根目录,选择在终端中打开,输入npm install安装依赖,之后上传并部署所有文件。我们可以在小程序端调用这个云函数,就可以得到云函数服务器的公网IP,这个IP是随机而有限的几个,反复调用getip,就能够穷举所有云函数所在服务器的ip了。可能你会在使用云函数连接数据库或者用云函数来建微信公众号的后台时需要用到IP白名单,我们可以把这些ip都添加到白名单里面,这样云函数就可以做很多事情啦。

三、加解密Crypto

crypto模块是nodejs的核心模块之一,它提供了安全相关的功能,包含对 OpenSSL 的哈希、HMAC、加密、解密、签名、以及验证功能的一整套封装。由于crypto模块是内置模块,我们引入它是无需下载,就可以直接引入。

使用开发者工具新建一个云函数,比如crypto,在index.js里输入以下代码,我们来了解一下crypto支持哪些加密算法,并以MD5加密为例:

const cloud = require('wx-server-sdk')
cloud.init({
    env: cloud.DYNAMIC_CURRENT_ENV,
})
const crypto = require('crypto');
exports.main = async (event, context) => {
    const hashes = crypto.getHashes(); 
    //获取crypto支持的加密算法种类列表


    //md5 加密 CloudBase2020 返回十六进制
    var md5 = crypto.createHash('md5');
    var message = 'CloudBase2020';
    var digest = md5.update(message, 'utf8').digest('hex');
    return {
        "crypto支持的加密算法种类":hashes,
        "md5加密返回的十六进制":digest
    };
}

将云函数部署之后调用从返回的结果我们可以了解到,云函数crypto模块支持46种加密算法。

四、Lodash实用工具库

Lodash是一个一致性、模块化、高性能的 JavaScript 实用工具库,通过降低 array、number、objects、string 等数据类型的使用难度从而让 JavaScript 变得更简单。Lodash 的模块化方法非常适用于:遍历 array、object 和 string;对值进行操作和检测;创建符合功能的函数。

技术文档: Lodash官方文档Lodash中文文档

使用开发者工具新建一个云函数,比如lodash,然后在package.json 增加 lodash最新版latest的依赖:

  "dependencies": {
        "lodash": "latest"
    }

在index.js里的代码修改为如下,这里使用到了lodash的chunk方法来分割数组:

const cloud = require('wx-server-sdk')
var _ = require('lodash');
cloud.init({
    env: cloud.DYNAMIC_CURRENT_ENV,
  })
exports.main = async (event, context) => {
    //将数组拆分为长度为2的数组
    const arr= _.chunk(['a', 'b', 'c', 'd'], 2);
    return arr;
}

右键lodash云函数目录,选择“在终端中打开”,npm install 安装模块之后右键部署并上传所有文件。我们就可以通过多种方式来调用它(前面已详细介绍)即可获得结果。Lodash作为工具,非常好用且实用,它的源码也非常值得学习,更多相关内容则需要大家去Github和官方技术文档里深入了解。

> 在awesome Nodejs页面我们了解到还有Ramba、immutable、Mout等类似工具库,这些都非常推荐。借助于Github的awesome清单,我们就能一手掌握最酷炫好用的开源项目,避免了自己去收集收藏。