0

假设我有一个实体“地址”和一个实体“用户”,它们以 1-n 关系链接。客户端发送在我的控制器功能中评估的所有必要数据。

Controller 类在头文件中声明了两个必需的 Mapper:

(auth.h)

namespace MDL = drogon_model::TestDB;

public:
  METHOD_LIST_BEGIN
    ADD_METHOD_TO(Authentication::registration, "/auth/register", Post,Options);
  METHOD_LIST_END
private:
  Mapper<MDL::User> userMapper = Mapper<MDL::User>(app().getFastDbClient());
  Mapper<MDL::Address> addressMapper = Mapper<MDL::Address>(app().getFastDbClient());

在控制器函数中,我想对两个实体使用映射器的插入方法,将数据异步插入表中。对于没有嵌套回调的地址和用户,等待两个插入的正确 C++ 方法是什么?欢迎使用 RxCpp 等库。

(auth.cc)

void Authentication::registration(const HttpRequestPtr& req,std::function<void (const HttpResponsePtr &)> &&callback) {
    Json::Value requestBody = *req->getJsonObject().get();
    MDL::User user(requestBody);
    userMapper.insert(user, [callback](const MDL::User &u) {
        LOG_DEBUG << "User Insert Success: ";
    }, [&isSuccess](const DrogonDbException &e) {
        LOG_DEBUG << e.base().what();
    });
    addressMapper.insert(address, [callback](const MDL::Address &a) {
        LOG_DEBUG << "Address Insert Success!";
    }, [](const DrogonDbException &e) {
        LOG_DEBUG << e.base().what();
    });
}

回调的类型为 std::function,但也有一个 std::future 类型的函数“insertFuture”可用

4

1 回答 1

0

您可以使用 CoroMapper<> 的协程接口来避免使用嵌套回调。

BTW:FastDbClient 对象与 IO 线程严格相关(每个 io 线程都有自己的 FastDbClient 对象),所以 app().getFastDbClient() 方法必须在 IO 线程(EventLoop)中调用,在你的代码中初始化 Mappers 会导致运行时错误。使用时请调用app().getFastDbClient()请求处理程序。

于 2021-04-01T17:00:01.883 回答