cloudwu / skynet

A lightweight online game framework
MIT License
13.29k stars 4.2k forks source link

bson error: Invalid value type : nil #678

Closed gjy1606 closed 7 years ago

gjy1606 commented 7 years ago

问题出在 bson_encode 上面,因为走到一个无法识别的 bson key 类型 分支,我在生产环境下面把这个 table 数据 dump 下来保存到文件,然后在自己机器上重新进行 bson_encode ,但是无法复现问题.

[:0100005c] [2017-6-4 20:36:21] lua call [100057b to :100005c : 0 msgsz = 5327] error : 
./../server/core/lualib/skynet.lua:541: ./../server/core/lualib/skynet.lua:156: Invalid value type : nil
stack traceback: 
    [C]: in function 'bson.encode' 
    ./../server/core/lualib/mongo.lua:370: in method 'update' 
    ./../server/server_common/service/mongodb.lua:85: in local 'f' 
    ./../server/server_common/lualib/service.lua:32: in upvalue 'f'
    ./../server/core/lualib/skynet.lua:111: in function <./../server/core/lualib/skynet.lua:105>

mongo.lua:370:

local pack = driver.update(self.full_name, flags, bson_encode(selector), bson_encode(update))

lua-bson.c

static void
append_one(struct bson *bs, lua_State *L, const char *key, size_t sz, int depth) {
    int vt = lua_type(L,-1);
    switch(vt) {
        case LUA_TNUMBER:
            break;
        case LUA_TUSERDATA: {
            break;
        }
        case LUA_TSTRING: {
            break;
        }
        case LUA_TTABLE:
            break;
        case LUA_TBOOLEAN:
            break;
        default:
            **luaL_error(L, "Invalid value type : %s", lua_typename(L,vt));**  // 走到该分支报错
        }
}
cloudwu commented 7 years ago

请把版面调好一点,看下面的: Styling with Markdown is supported

cloudwu commented 7 years ago

看起来是你打包的数组里有洞(nil)。

cloudwu commented 7 years ago

https://github.com/cloudwu/skynet/commit/d6eb49e4eb05fd8fcade50ca965aa17011530d2c 现在已经完全禁止了字典的 key 使用数字。