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头文件。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值