小程序的数据库操作是异步的。云函数中执行数据库操作往往在数据库操作还未执行完成就返回了,对于数据库的执行状态判断十分不足。如下面这种情况:
我的目的是为了判断用户是否注册登录的。写在云函数中是为了方便获取openid
// 云函数入口文件
const cloud = require('wx-server-sdk');
// 初始化 cloud
cloud.init({
// API 调用都保持和云函数当前所在环境一致
env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database();
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
let openid = wxContext.OPENID;
let unionid = wxContext.UNIONID;
let returncode = 100;
db.collection("userinfoTable").where({
userid:openid
}).get().then(res =>{
if(res.data.length==0){
returncode = 200;
}else if(res.data.length==1){
returncode = 201;
}else{
returncode = 400;
}
});
return {
openid,
returncode
}
};
这样做返回的结果中returncode是初始值100.因为在异步db未执行完成后数据库就已经返回了。
此时我们引入async/await的组合。使用如下模板:
const cloud = require('wx-server-sdk');
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database();
exports.main = async (event, context) => {
return saveuserinfo();
};
// 创建异步函数并将代码放到异步函数里面执行。
async function saveuserinfo() {
await db.collection("userinfoTable").where({
userid:openid
}).get().then(res =>{
....
});
return {
....
}
};
// 云函数入口文件
const cloud = require('wx-server-sdk');
// 初始化 cloud
cloud.init({
// API 调用都保持和云函数当前所在环境一致
env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database();
// 云函数入口函数
exports.main = async (event, context) => {
return saveuserinfo();
};
async function saveuserinfo() {
const wxContext = cloud.getWXContext()
let openid = wxContext.OPENID;
let unionid = wxContext.UNIONID;
let returncode = 100;
await db.collection("userinfoTable").where({
userid:openid
}).get().then(res =>{
if(res.data.length==0){
returncode = 200;
}else if(res.data.length==1){
returncode = 201;
}else{
returncode = 400;
}
});
return {
openid,
returncode
}
};
返回值如下。因为我的数据库中已经有相应的记录了。对应的就把returncode赋值为201了。
写在最后:
[1] 我尝试了直接在main方法中使用await 这样会报错,不知道为何。
[2] 要注意云开发中数据库操作消耗时间比较久。使用await会严重影响时效性。可能会影响用户体验。