首先看我封装的调用云函数 云对象的js
//封装请求云对象的公共方法
/**
* @param {String} objName 云对象名字
* @param {String} funName 云对象中的方法函数名字
* @param {Object} params 方法中需要传递的参数,以对象的方式传递
*/
function cloudObject(objName, funName, params={}){
let token = uni.getStorageSync('token');
if(token){ params.token = token }
return new Promise((resolve, reject)=> {
uniCloud.importObject(objName)[funName](params).then(res=>{
if(res.code == 401){
uni.clearStorage()//清除所有缓存,并提示跳转登录
uni.showModal({
title: '温馨提示',
content: '您还未登录,是否去登录?',
success: function (res) {
if (res.confirm) {
uni.navigateTo({
url: '/pages/login/wxAuthorize/wxAuthorize'
})
} else if (res.cancel) {
let pages = getCurrentPages();
let prevPage = pages[pages.length - 2] // 上一个页面
if(prevPage){
uni.navigateBack({delta: 1})
}
}
}
});
}
return resolve(res)
}).catch(err=>{
return reject(err)
})
})
}
/**
* @param {Object} option 内含有 name 云函数名字 data 传递参数 success faile complete 回调函数
*/
// 封装请求云函数公共方法
function cloudFunction(option) {
let token = uni.getStorageSync('token');
return new Promise((resolve, reject) => {
if (!option.data) option.data = {};
if (token) option.data.token = token;
uni.showLoading({
title: "努力加载中",
mask:true
});
uniCloud.callFunction({
name: option.name,
data: option.data,
success: (res) => {
uni.hideLoading();
if (res.result.code == 200) {
if (res.result.data.token) {
token = res.result.data.token;
uni.setStorageSync('token', res.result.data.token);
}
if (option.success) option.success(res.result.data);
resolve(res.result.data);
} else if(res.result.code == 401) {
uni.clearStorageSync();
uni.showToast({
icon: 'none',
title: token?'请重新登录':'请登录'
})
setTimeout(()=>{
uni.switchTab({
url:'/pages/mine/mine'
})
},1000)
} else {
uni.showToast({
icon: 'none',
title: res.result.msg
})
if (option.fail) option.fail(res.result);
}
},
fail: (err) => {
console.log(err)
uni.hideLoading();
if (option.fail) option.fail(err);
reject(err);
},
complete: (msg) => {
uni.hideLoading();
if (option.complete) option.complete(msg);
}
});
});
}
module.exports = {
cloudFunction: cloudFunction,
cloudObject: cloudObject
}
登录调用
wxLogin() {
let _this = this
uni.getUserProfile({
desc: '用于完善用户信息资料',
success: (info) => {
// 获取用户信息成功, info.authResult保存用户信息
uni.login({
provider: 'weixin',
success: function(loginRes) {
// 授权登录成功
let params = {
code: loginRes.code,
avatarUrl: info.userInfo.avatarUrl,
nickName: info.userInfo.nickName,
gender: info.userInfo.gender
}
_this.$cloudApi.cloudFunction({
name: "wx-login",
data: params,
success: (res) => {
console.log(res)
uni.showToast({
title: "登录成功",
icon: 'success'
})
uni.setStorageSync('token', res.token)
uni.setStorageSync('userInfo', res.userInfo);
_this.isLoading = true
setTimeout(()=>{
uni.navigateBack({ delta: 1 });
}, 1000)
},
fail:(err)=>{
console.log(err)
uni.showToast({
title: err.errMsg,
icon:"none"
})
}
})
},
fail: function(err) {
// 登录授权失败
uni.showToast({
title: err,
icon: 'error'
})
return
}
});
},
fail: (errMsg) => {
console.log(errMsg)
}
})
}
登录授权 云函数
'use strict';
const { appId, appSecret, getToken, wrapResponse } = require("wx-common");
exports.main = async (event, context) => {
const dbJQL = uniCloud.databaseForJQL({ event, context })
// 获取User 表
const wxUser = dbJQL.collection("wx-user")
// 获取前端参数
const { code, nickName, avatarUrl, gender } = event
// 根据code 获取openid
const res = await uniCloud.httpclient.request(`https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${appSecret}&js_code=${code}&grant_type=authorization_code`, {method: 'GET',data: {},contentType: 'json',dataType: 'json'})
let openid = res.data.openid
let nowTime = new Date().getTime() //当前登录时间时间戳
// 获取登录用户信息
let loginUserInfo = { openid, avatarUrl, nickName, gender, lastLogintime: nowTime}
try {
const queryResult = await wxUser.where({ openid: openid }).get();
if (queryResult.data.length > 0) {
// 用户存在,进行更新最后登录时间
const updateResult = await wxUser.where({openid: openid}).update({lastLogintime: nowTime});
if(updateResult.updated){
// 更新成功后获取用户的信息
let getUserInfo = await wxUser.where({openid: openid}).field("avatarUrl,nickName,gender,phone").get()
let userInfo = getUserInfo.data[0]
// 生成token
let token = getToken(userInfo._id, openid, nowTime)
return wrapResponse("success", { token, userInfo }, "登录成功~")
}
} else {
let otherFields = {
phone: "",
parentId: "",
registTime: nowTime
}
// 用户不存在,进行添加操作
const addResult = await wxUser.add({...loginUserInfo, ...otherFields });
if(addResult.id){
// 如果存在则证明添加成功,添加成功后查询用户信息并返回用户信息
// 获取新增用户的完整信息
let getUserInfo = await wxUser.doc(addResult.id).field("avatarUrl,nickName,gender,phone").get()
let userInfo = getUserInfo.data[0]
// 生成token
let token = getToken(userInfo._id, openid, nowTime)
return wrapResponse("success", { token, userInfo }, "登录成功")
}
}
} catch (error) {
return error;
}
}
连接本地云函数的时候没问题,但是连接到云端云函数的时候就会报错
code: "FunctionBizError"
httpStatus: 200
message: "Right-hand side of 'instanceof' is not an object"
MagicLamp (作者)
多谢回复,已经解决了,是因为本地运行默认的环境是nodejs12 ,使用的jwt, 上传到云端的时候,云对象运行的环境是nodejs 8 ,改了下配置就可以了
2023-08-18 15:34
3***@qq.com
回复 MagicLamp: 你好,请问你是怎么修改的配置?是把原来的nodejs卸掉,再重新安装nodejs8吗?
2023-12-30 09:59