评论

uni-app对微信小程序云函数的适配

uni-app并未对云函数进行相应的适配。如果我们要使用云函数呢?我们知道,云函数可以复制到微信开发者工具,这样的话我们不得不每次编译一次就手动复制一次,不得不说麻烦至极。本文就问题做出以下解决方案。

版权说明

本文首发于指尖魔法屋>uni-app对微信小程序云函数的适配. 转载请附上原地址

引言

熟悉uni-app的人应该都知道,uni-app并未对微信小程序云函数(本文统称云函数)进行相应的适配。但是,如果我们在某些业务场景的下需要使用云函数呢?我们知道,云函数可以复制到微信开发者工具,这样的话我们不得不每次编译一次就手动复制一次,不得不说麻烦至极。本文就问题做出以下解决方案。

本文环境

  1. Hbuilder X

  1. 微信开发者工具

创建云函数目录

首先,我们需要在uni-app项目文件夹下,创建一个云函数目录,路径随意,我这里是functions。然后先随便在里面放一些文件,这里以new_file.css为例。

修改manifest.json

在uni-app根目录下,修改manifest.json中的微信小程序项,结构如下

"mp-weixin" : {
        /* 小程序特有相关 */
        "appid" : "wxd7de467f6e6cf741",
        "cloudfunctionRoot": "./functions/", // 这一行就是标记云函数目录的字段
        "setting" : {
            "urlCheck" : false
        },
        "usingComponents" : true
    }

编写vue.config.js

  1. 我们在项目根目录创建vue.config.js文件
  2. 写入以下内容(如路径不一样请做相应适配)
const path = require('path')
const CopyWebpackPlugin = require('copy-webpack-plugin')

module.exports = {
    configureWebpack: {
        plugins: [
            new CopyWebpackPlugin([
                {
                    from: path.join(__dirname, 'functions'),
                    to: path.join(__dirname, 'unpackage/dist', process.env.NODE_ENV === 'production' ? 'build' : 'dev', process.env.UNI_PLATFORM, 'functions')
                }
            ])
        ]
    }
}
  1. 编译运行

发现提示如下内容

说明未安装copy-webpack-plugin插件,我们手动安装一下。

然后编译运行,发现微信开发者工具里面出现以下内容。


截止目前,已打通Hbuilder X到微信开发者工具的自动复制,即已解决本文的核心内容。以下为进一步测试。

创建云函数

我们在云函数根目录上右键,在右键菜单中,可以选择创建一个新的 Node.js 云函数,我们将该云函数命名为check。开发者工具在本地创建出云函数目录和入口 index.js 文件,同时在线上环境中创建出对应的云函数。创建成功后,工具会提示是否立即本地安装依赖,确定后工具会自动安装 wx-server-sdk。我们会看到以下内容。

创建好后将其同步复制到uni-app项目,即可为以后自动同步行方便,又可避免在输出文件夹中云函数的意外丢失。至此,相关文件编写工作转至Hbuilder X,云函数上传部署依旧在微信开发者工具。

编写云函数

默认的云函数只是一个返回用户基本数据的内容,我们将其修改至满足我们的业务需求,以内容安全云调用为例。

在云函数文件中写入以下内容

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()

// 云函数入口函数
exports.main = async(event, context) => {
  try {
    console.log('待检测文本:' + event.content);
    let result = await cloud.openapi.security.msgSecCheck({
      content: event.content
    })
    console.log('result:' + JSON.stringify(result));

    if (result && result.errCode.toString() === '87014') {
      return {
        code: 300,
        msg: '内容含有违法违规内容',
        data: result
      }
    } else {
      return {
        code: 200,
        msg: 'ok',
        data: result
      }
    }

  } catch (err) {
    if (err.errCode.toString() === '87014') {
      return {
        code: 300,
        msg: '内容含有违法违规内容',
        data: err
      }
    }
    return {
      code: 400,
      msg: '调用security接口异常',
      data: err
    }
  }
}

权限申明

在函数目录下,创建一个config.json,文档说会自动创建,但是我实际操作时未自动创建。config.json内容如下。

{
	"permissions": {
		"openapi": [
			"security.msgSecCheck"
		]
	}
}

然后在函数目录右键,上传并部署。

小程序调用云函数

wx.cloud.init()
				wx.cloud.callFunction({
					name: 'check',
					data: {
						"content": this.contents.join()
					}
				}).then(res => {
					console.log(res.result)
					if (res.result.code == 300) {
						uni.showModal({
							title: "温馨提示",
							content: "你所输入的内容可能含有违法违规内容,不支持进行下一步操作"
						})
						return
					} else {
						... // 你要进行的操作
					}
				})

效果展示

点赞 1
收藏
评论

2 个评论

  • DNS-周桐
    DNS-周桐
    2020-05-22

    感谢大神的分享!但是今天试的时候发现copy-webpack-plugin插件最近版6.0.1改了new CopyWebpackPlugin()的代码,而且哪怕按照他们文档修改还是有莫名其妙的getLogger()异常,无奈指定了copy-webpack-plugin使用5.0.3版本,完美运行。只能说作为开源项目向下不兼容真的是杀千刀:)

    2020-05-22
    赞同 3
    回复 8
    • tantantan
      tantantan
      2020-05-27
      千刀万剐!
      2020-05-27
      回复
    • 王克淼
      王克淼
      2020-07-02
      兄弟先了解一下版本的含义…… 大版本更新基本就是意味着 api 不兼容
      2020-07-02
      回复
    • DNS-周桐
      DNS-周桐
      2020-07-02回复王克淼
      在开源领域,API向下不兼容是饱受诟病的,试想你的上游的上游项目引用的某个项目,为了打上最新的安全补丁升级到最新版本,完了以后突然整个接口语法全部变了,所有引用了这个库的项目升级后全部扑街,您难道不想问候一下他们项目组吗?不是说他们道德上值得谴责,毕竟都是开源项目用爱发电,但是被下游引用极多开源项目在大改前需要谨慎、或者提供不同分支以提供持续支持,这点算是开源世界的一个基本公约吧。
      2020-07-02
      回复
    • 王克淼
      王克淼
      2020-07-02回复DNS-周桐
      所以谨慎选择大版本是常识,因为 api 不兼容是不可避免的
      2020-07-02
      回复
    • DNS-周桐
      DNS-周桐
      2020-07-02回复王克淼
      所以建议楼主修改下教程,安装依赖部分指定版本号而不是用latest。否则这个教程还会有很多人中招
      2020-07-02
      回复
    查看更多(3)
  • 力场科技
    力场科技
    2019-11-23

    欢迎大家交流指点

    2019-11-23
    赞同
    回复
登录 后发表内容