drogon orm分页问题,req->getJsonObject()为空会导致Segmentation fault

2024年6月22日17:14:12

req->getJsonObject()获取json数据的时候,如果没有提前判断

if (req->getJsonObject() == nullptr)
        {
            throw std::invalid_argument("参数json不能为空");
        }

        auto jsonPtr = req->getJsonObject();

官方文档:https://github.com/drogonframework/drogon/wiki/CHN-08-3-数据库-ORM#mapper的链式接口

Mapper的链式接口

有些常见的sql约束,比如limit,offset等等,Mapper类模板也提供了支持,以链式接口的形式提供,意味着用户可以把多个约束串起来写。执行完任何一个接口,这些约束会被清空,也就是说,这些约束是在一次操作中有效的,比如:

Mapper<Users> mp(dbClientPtr);
auto users = mp.orderBy(Users::Cols::_join_time).limit(25).offset(0).findAll();

注意这里的limit offset是sql的原意,不是我们常用的封装过的orm,所以需要自己去维护一下offset

这段程序是从users表中选择用户列表,每页25行的第一页

Json::Value ret;
    ret["code"] = SUCCESS;
    ret["msg"] = SUCCESS_MSG;

    try
    {
        if (req->getJsonObject() == nullptr)
        {
            throw std::invalid_argument("参数json不能为空");
        }

        auto jsonPtr = req->getJsonObject();

        // 转换指针
        auto pJson = *jsonPtr;
        LOG_DEBUG << pJson.toStyledString();
        // 获取对应的参数
        std::string page = pJson.get("page", 1).asString();
        std::string pageSize = pJson.get("pageSize", 10).asString();

        auto offset = (std::stoi(page) - 1) * std::stoi(pageSize);

        auto clientPtr = drogon::app().getDbClient();
        Mapper<Admin> mp(clientPtr);

        LOG_DEBUG << std::stoi(pageSize);
        LOG_DEBUG << std::stoi(page);
        std::vector<Admin> admin_list = mp.orderBy(Admin::Cols::_id).limit(std::stoi(pageSize)).offset(offset).findAll();

        auto count = admin_list.size();
        auto list = admin_list;

        Json::Value data;
        data["count"] = count;

        Json::Value json_list;
        if (count > 0)
        {
            for (auto admin : admin_list)
            {
                json_list.append(admin.toJson());
            }
        }
        data["list"] = json_list;

        ret["data"] = data;
        auto resp = HttpResponse::newHttpJsonResponse(ret);
        resp->setStatusCode(k200OK);
        callback(resp);
    }
    catch (std::exception &e)
    {
        ret["code"] = FAIL;
        LOG_ERROR << e.what();
        ret["msg"] = e.what();
        auto resp = HttpResponse::newHttpJsonResponse(ret);
        resp->setStatusCode(k200OK);
        callback(resp);
    }

链式接口基本可以望文生义,这里不再一一赘述,请参考Mapper.h头文件。