编者荐语:
本篇内容为「图雀社区」使用 LeanCloud 开发 Taro 小程序的经验分享,经授权进行转载。
以下文章来源于图雀社区 ,作者一只图雀
汇集精彩的实战教程,关注回复「交流」拉你进学习交流群,与爱好技术的小伙伴共同成长!
首先我们先来看一下最终的运行效果:
注册外站服务的账号
找到对应的小程序开发接入指南
获取对应的接入地址,将接入地址填入小程序后台的白名单列表
在小程序实际接入,并进行测试
注意:LeanCloud 没有提供支付宝的接入指南,但是小程序接入指南都基本类似,我们会一一讲解这一流程。
const API_BASE_URL = ''
const LOGIN_URL = `${API_BASE_URL}/1.1/functions/login`
const CREATE_POST_URL = `${API_BASE_URL}/1.1/functions/createPost`
const GET_POST_URL = `${API_BASE_URL}/1.1/functions/getPost`
const GET_POSTS_URL = `${API_BASE_URL}/1.1/functions/getPosts`
const HEADER = {
'X-LC-Prod': 1,
'X-LC-Id': '',
'X-LC-Key': '',
}
const convertUserFormat = user => {
const _id = user.objectId
delete user.objectId
return { ...user, _id }
}
const convertPostFormat = post => {
const _id = post.objectId
const user = convertUserFormat(post.user)
delete post.objectId
delete post.user
return { ...post, _id, user }
}
const convertPostsFormat = posts => {
const convertedPosts = posts.map(post => convertPostFormat(post))
return convertedPosts
}
export {
LOGIN_URL,
HEADER,
CREATE_POST_URL,
GET_POST_URL,
GET_POSTS_URL,
convertPostsFormat,
convertPostFormat,
convertUserFormat,
}
定义云函数的 REST URL,LeanCloud 的云函数 REST URL 的格式类似这样:https://API_BASE_URL/1.1/functions/functionName,其中 API_BASE_URL 可以通过文档获取:文档链接 [5];而 functionName 即为我们需要调用的云函数名字。这里我们定义了 API_BASE_URL ,我们给了空字符串,读者可以根据 LeanCloud 给与的 Base URL 替代空字符串;同样我们定义了四个云函数,分别代表登录、创帖、查询帖子列表、查询单个帖子,具体的云端云函数我们将在后面定义。
第二个部分即为向 LeanCloud 服务器发送 REST 请求时需要携带的请求头部,这个也可以在文档里给出:文档链接 [6];这里也需要用户用自己的内容来替换上面的空字符串。
第三个部分则为两个辅助转换格式的函数,主要用于将 LeanCloud 数据库格式的数据与现有的微信小程序数据库格式的数据兼容。
第四个部分为导出这些定义的内容,供其它模块使用。
提示:上面的 API_BASE_URL 和 HEADER 都需要用户在登录的情况下访问给出的地址才能获取到。
avatar
nickName
content
title
user
创建云函数
部署
在小程序端进行调试
选择我们要创建的函数类型,主要有三类,这里我们选择 Function ,这也是默认选择的类型,其余两类读者有兴趣可以自行探索,这里我们不展开讲。
接着就是定义你的函数名,这里我们填入 login。
接着就是编写函数体,它是一个 Node.js 函数,我们只需要编写对应的 Node.js 处理逻辑就可以了。
最后我们可以对这个函数写一点注释,方便日后回顾,这里我们选择不填入。
const { userInfo } = request.params
const query = new AV.Query('MyUser')
query.equalTo('nickName', userInfo.nickName)
const users = await query.find()
if (users.length > 0) {
return users[0]
} else {
const MyUser = AV.Object.extend('MyUser')
const myUser = new MyUser()
const { nickName, avatar } = userInfo
myUser.set('nickName', nickName)
myUser.set('avatar', avatar)
const user = await myUser.save()
return user
}
从 request.params 取到对应的请求体数据 userInfo,这决定了我们之后在小程序端调用 LeanCloud 云函数时,要使用 POST 的方式。
接着我们使用了 LeanCloud 的查询 SDK 操作
首先通过 new AV.Query 新建一个对 MyUser Class 的查询请求。
注意到这里的 AV 接口是 LeanCloud 暴露给我们的默认接口,可以通过这个接口操作 LeanCloud 的各种资源。
接着通过 equalTo 进行条件过滤,这里我们查询 nickName 为 userInfo.nickName 的用户。
通过 query.find() 来提交查询操作,注意到这里我们使用了 await 关键字,那是因为默认包裹云函数提的是一个 async 函数,允许我们方便的执行异步流程。
接着我们对查询到的数据进行判断,如果 users.length > 0 表示存在用户,那么我们返回查询到的第一个用户;如果不存在,我们执行创建用户操作,再返回创建的用户。
创建用户的操作主要是如下几个步骤:
AV.Object.extend 对应的 Class 来获取对应的类
实例化这个类获取一个对象
设置这个对象的属性,这里通过 set(key, value) 的方式设置
通过对象的 save 方法进行保存,保存到 LeanCloud 数据库
注意:这里我们只用到了 LeanCloud 的一些简单操作,具体的详情可以查看官方文档,官方文档撰写了非常完备的操作指南:链接 [7]。
import { useDispatch } from '@tarojs/redux'
import './index.scss'
import { LOGIN } from '../../constants'
export default function AlipayLoginButton(props) {
const [isLogin, setIsLogin] = useState(false)... userInfo = JSON.parse(userInfo.response).response
const { avatar, nickName } = userInfo
dispatch({
type: LOGIN,
payload: {
userInfo: {
avatar,
nickName,
},
},
})
} catch (err) {
我们删掉了使用支付宝获取登录信息之后存缓存的逻辑
接着,我们 dispatch 了一个 action.type 为 LOGIN 的异步 ACTION,并传递了 userInfo 数据
最后我们导入了需要的 LOGIN 常量。
import Taro from '@tarojs/taro'
import { HEADER, LOGIN_URL, convertUserFormat } from './utils'
async function login(userInfo) {
const isWeapp = Taro.getEnv() === Taro.ENV_TYPE.WEAPP
const isAlipay = Taro.getEnv() === Taro.ENV_TYPE.ALIPAY
const isH5 = Taro.getEnv() === Taro.ENV_TYPE.WEB
// 针对微信小程序使用小程序云函数,其他使用小程序 RESTful API
try {... })
return result.user
} else if (isAlipay || isH5) {
const { data } = await Taro.request({
url: LOGIN_URL,
method: 'POST',
header: { ...HEADER },
data: {
userInfo,
},
})
return convertUserFormat(data.result)
}
} catch (err) {
console.error('login ERR: ', err)
首先我们导入了之前定义的和 LeanCloud 有个的 utils 函数。
接着我们加入了对 H5 环境的判断。
最后我们增加了一个 else if 流程,用于判断在支付宝小程序或者 H5 环境下需要执行发起 REST 请求的逻辑,这里我们使用了 Taro.request 进行网络请求,并传入了对应的 url、header、data,以及将请求的类型设置为 POST,之前我们提到过,对 LeanCloud 云函数发起请求都需要使用 POST 方法。
最后我们将从 LeanCloud 拿到的请求结果使用 convertUserFormat 做了一次格式的转换,以适应现有的微信小程序数据类型。
createPost
getPosts
getPost
const { postData, userId } = request.params
const Post = AV.Object.extend('Post')
const post = new Post();
const myUser = AV.Object.createWithoutData('MyUser', userId)
const newPost = await post.save({
...postData,
user: myUser
});
const query = new AV.Query('Post')
const postWithUser = await query.equalTo('objectId', newPost.get('objectId')).include('user').first()
return postWithUser
const query = new AV.Query('Post')
const posts = await query.include('user').find()
return posts
const { postId } = request.params
const query = new AV.Query('Post')
const post = await query.equalTo('objectId', postId).include('user').first()
return post
import Taro from '@tarojs/taro'
import {
HEADER,
CREATE_POST_URL,
GET_POSTS_URL,
GET_POST_URL,
convertPostFormat,
convertPostsFormat,
} from './utils'
async function createPost(postData, userId) {
const isWeapp = Taro.getEnv() === Taro.ENV_TYPE.WEAPP
const isAlipay = Taro.getEnv() === Taro.ENV_TYPE.ALIPAY
const isH5 = Taro.getEnv() === Taro.ENV_TYPE.WEB
// 针对微信小程序使用小程序云函数,其他使用小程序 RESTful API
try {... })
return result.post
} else if (isAlipay || isH5) {
const { data } = await Taro.request({
url: CREATE_POST_URL,
method: 'POST',
header: { ...HEADER },
data: {
postData,
userId,
},
})
return convertPostFormat(data.result)
}
} catch (err) {
console.error('createPost ERR: ', err)...async function getPosts() {
const isWeapp = Taro.getEnv() === Taro.ENV_TYPE.WEAPP
const isAlipay = Taro.getEnv() === Taro.ENV_TYPE.ALIPAY
const isH5 = Taro.getEnv() === Taro.ENV_TYPE.WEB
// 针对微信小程序使用小程序云函数,其他使用小程序 RESTful API
try {... })
return result.posts
} else if (isAlipay || isH5) {
const { data } = await Taro.request({
url: GET_POSTS_URL,
method: 'POST',
header: { ...HEADER },
})
return convertPostsFormat(data.result)
}
} catch (err) {
console.error('getPosts ERR: ', err)...async function getPost(postId) {
const isWeapp = Taro.getEnv() === Taro.ENV_TYPE.WEAPP
const isAlipay = Taro.getEnv() === Taro.ENV_TYPE.ALIPAY
const isH5 = Taro.getEnv() === Taro.ENV_TYPE.WEB
// 针对微信小程序使用小程序云函数,其他使用小程序 RESTful API
try {... })
return result.post
} else if (isAlipay || isH5) {
const { data } = await Taro.request({
url: GET_POST_URL,
method: 'POST',
header: { ...HEADER },
data: {
postId,
},
})
return convertPostFormat(data.result)
}
} catch (err) {
console.error('getPost ERR: ', err)
首先我们导入了之前定义的和 LeanCloud 有关的 utils 函数。
接着我们加入了对 H5 环境的判断。
最后我们增加了一个 else if 流程,用于判断在支付宝小程序或者 H5 环境下需要执行发起 REST 请求的逻辑,这里我们使用了 Taro.request 进行网络请求,并传入了对应三个和 Post 逻辑有关的 url 、以及对应的 header、data,以及将请求的类型设置为 POST,之前我们提到过,对 LeanCloud 云函数发起请求都需要使用 POST 方法。
最后我们将从 LeanCloud 拿到的请求结果使用 convertPostFormat 做了一次格式的转换,以适应现有的微信小程序数据类型。
首先我们讲解了微信小程序云的不足,然后引出了 LeanCloud 来实现跨端小程序开发
接着我们介绍了 LeanCloud 服务的配置过程,具体包含 1)注册登录 LeanCloud 2)配置对应的小程序后台的白名单。且因为 LeanCloud 没有支付宝小程序的 SDK,所以我们采用 REST 请求的方式来获取和修改对应的数据
接着我们讲解了如何在 LeanCloud 上面创建数据表。
接着,我们介绍了如何在 LeanCloud 创建云函数。
最后我们通过三步走流程:
1)创建云函数 2)部署 3)在小程序端测试,创建了我们需要的四个云函数。
提示:微信/支付宝小程序对于有社交、社区性质的小程序是需要企业认证的,所以有类似需求的需要做一下准备。
「图雀社区」是一个供大家分享用「Tuture」写作工具完成教程的一个平台,在这里,读者们可以尽情享受高质量的实战教程,并且与作者和其他读者互动和讨论;而作者们也可以借此传播他们的技术知识,宣传他们的开源项目。
[1] 访问地址:https://www.leancloud.cn/
[2] 访问地址:https://leancloud.cn/docs/weapp.html
[3] 访问地址:https://mini.open.alipay.com/channel/miniIndex.htm
[4] 访问地址:https://leancloud.cn/docs/leanengine-rest-api.html#hash20005220
[5] 文档链接:https://leancloud.cn/docs/leanengine-rest-api.html#hash-1722650509
[6] 文档链接:https://leancloud.cn/docs/leanengine-rest-api.html#hash20005220
[7] 点我查看:https://leancloud.cn/docs/leanstorage_guide-js.html
[8] 地址:https://taro.jd.com/
[9] 链接地址:https://mp.weixin.qq.com
[10] 链接地址:https://mini.open.alipay.com/channel/miniIndex.htm
end