社区/学习指南/小程序·云开发高级教程

云函数实用工具库

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

11.3.1 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来指定时区即可。

11.3.2 获取公网 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 都添加到白名单里面,这样云函数就可以做很多事情啦。

11.3.3 加解密 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 种加密算法。

11.3.4 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 清单,我们就能一手掌握最酷炫好用的开源项目,避免了自己去收集收藏。

本文出自 李东bbsky