MagicLamp
MagicLamp
  • 发布:2023-08-16 22:20
  • 更新:2023-08-17 11:54
  • 阅读:275

unicloud 小程序云开发 连接本地没问题 连接云端就报错 "Right-hand side of 'instanceof' is not an object"

分类:uniCloud

首先看我封装的调用云函数 云对象的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"

2023-08-16 22:20 负责人:无 分享
已邀请:
DCloud_uniCloud_WYQ

DCloud_uniCloud_WYQ

云函数日志发一下

  • MagicLamp (作者)

    多谢回复,已经解决了,是因为本地运行默认的环境是nodejs12 ,使用的jwt, 上传到云端的时候,云对象运行的环境是nodejs 8 ,改了下配置就可以了

    2023-08-18 15:34

  • 3***@qq.com

    回复 MagicLamp: 你好,请问你是怎么修改的配置?是把原来的nodejs卸掉,再重新安装nodejs8吗?

    2023-12-30 09:59

要回复问题请先登录注册