i***@lzc.im
i***@lzc.im
  • 发布:2022-10-09 14:29
  • 更新:2022-10-10 11:28
  • 阅读:328

【已解决】数据库第一次写入失败,连续请求时成功

分类:uniCloud

例如我写了一个公共模块,里面的功能是向数据库的log表写日志。这个公共模块被其他公共模块所引用。写法如下
wlog-公共模块(写日志用的)
getuser-公共模块(用来获取用户信息的)
Switch-普通云函数(用来接收请求的)。
依赖关系,switch依赖getuser,
getuser 依赖wlog
具体上代码

//wlog-公共模块  
const db = uniCloud.database() //数据库常量  
module.exports = function(openid, type, data) {  
    db.collection('log').add({  
            oid: openid,  
            type: type,  
            data: data,  
            date: Date.now()  
        });  
        return  
}
//getuser-获取用户信息公共模板  
const db = uniCloud.database() //数据库常量  
const wlog = require('wlog')  
module.exports = async function(openid) {  
    let obj = new Object()  
    let user = await db.collection('user').where({oid:openid}).get()  
       obj = user.data[0]  
    wlog(openid,6003,obj)//此处写入操作日志  
    return obj  
}
//switch  
'use strict';  
const checktoken = require('checktoken')  
const getuser = require('getuser')  

exports.main = async (event, context) => {  
    let objreturn = new Object()  
    objreturn.errmsg = ''  
    objreturn.err = false  
    if (event.type == null) {  
        objreturn.errmsg = '未知请求类型'  
        objreturn.err = true  
        return objreturn  
    }  
    if (event.token == ''||!("token" in event)) {  
        objreturn.errmsg = '请求没有携带token'  
        objreturn.err = true  
        return objreturn  
    }  
    let user = checktoken(event.token) //所有行为必须带有token  
    if (user.renew) {  
        objreturn.errmsg = '用户信息过期,请从新打开小程序'  
        objreturn.err = true  
        return objreturn  
    }  

    switch (event.type) {  
        case 6003:  
            objreturn = getuser(user.openid) //获取用户信息仅需要openid  
            break;  
        default:  
            objreturn.errmsg = '未找到请求类型'  
            objreturn.err = true  
            break;  
    }  

    //返回数据给客户端  
    return objreturn  
};  

上面的代码第一次运行时并不会写入任何日志,客户端会返回用户信息。
只有连续请求时才会写入。这是种灵异事件吧。连续请求时会执行写入证明代码逻辑并无问题。
太长时间不请求即写入失败。有点像冷启动写入失效的样子。

2022-10-09 14:29 负责人:无 分享
已邀请:
DCloud_uniCloud_WYQ

DCloud_uniCloud_WYQ

代码逻辑还是有问题的wlog-公共模块没有等待写入操作,云函数执行结束后会被冻结写入代码不一定会在本次调用执行。如果你需要写入日志和查询用户同时执行,可以使用promise.all

  • i***@lzc.im (作者)

    原来如此,难怪我就觉得很诡异。我原本的思路是不需要等待的。毕竟日志写入等了也没奖励。也不需要返回点啥。本地测试完全没有问题

    2022-10-10 14:07

该问题目前已经被锁定, 无法添加新回复