繁体   English   中英

Sequelize在插入后不检索所有数据

[英]Sequelize not retrieving all data after insert

我注意到我的后端在插入后没有检索到预期的数据。 在我的 React 应用程序中,我有一个 function 将数据插入数据库,在收到响应后,将发送一个新请求以使用新获取的数据更新当前组件 state。 我所有的函数都使用 await/async 并且在后端,所有事务都被正确使用并按顺序提交。

我的客户正在调用以下端点:-POST: api/ticket ( INSERT AN ITEM) -GET: api/ticket (GET ALL ITEMS)

这是后端显示的内容,在我看来是正确的,问题是在“SELECT”语句中,未检索到插入的项目。 交易是从两条不同的路线开始的,但我不明白为什么这会成为一个问题。 此外,我尝试将AddItem function 更改为output 与使用GET 方法时调用的相同的findAll 语句并且返回的数据是正确的。 那么,如果我将这两个流程分开,为什么我得不到所有项目呢? 我总是需要刷新页面来获取添加的项目。

START TRANSACTION;
Executing (a9d14d5c-c0ac-4821-9b88-293b086debaa): INSERT INTO `messages` (`id`,`message`,`createdAt`,`updatedAt`,`ticketId`,`userId`) VALUES (DEFAULT,?,?,?,?,?);
Executing (a9d14d5c-c0ac-4821-9b88-293b086debaa): COMMIT;
Executing (9ee9ddaa-294e-41d1-9e03-9f02a2737030): START TRANSACTION;
Executing (9ee9ddaa-294e-41d1-9e03-9f02a2737030): SELECT `ticket`.`id`, `ticket`.`subject`, `ticket`.`status`, `ticket`.`createdAt`, `ticket`.`updatedAt`, `ticket`.`deletedAt`, `ticket`.`userId`, `messages`.`id` AS `messages.id`, `messages`.`message` AS `messages.message`, `messages`.`sender` AS `messages.sender`, `messages`.`createdAt` AS `messages.createdAt`, `messages`.`updatedAt` AS `messages.updatedAt`, `messages`.`deletedAt` AS `messages.deletedAt`, `messages`.`ticketId` AS `messages.ticketId`, `messages`.`userId` AS `messages.userId`, `messages->user`.`id` AS `messages.user.id`, `messages->user`.`firstname` AS `messages.user.firstname`, `messages->user`.`surname` AS `messages.user.surname`, `messages->user`.`email` AS `messages.user.email`, `messages->user`.`password` AS `messages.user.password`, `messages->user`.`stripeId` AS `messages.user.stripeId`, `messages->user`.`token` AS `messages.user.token`, `messages->user`.`birthDate` AS `messages.user.birthDate`, `messages->user`.`status` AS `messages.user.status`, `messages->user`.`confirmationCode` AS `messages.user.confirmationCode`, `messages->user`.`createdAt` AS `messages.user.createdAt`, `messages->user`.`updatedAt` AS `messages.user.updatedAt`, `messages->user`.`deletedAt` AS `messages.user.deletedAt` FROM `tickets` AS `ticket` LEFT OUTER JOIN `messages` AS `messages` ON `ticket`.`id` = `messages`.`ticketId` AND (`messages`.`deletedAt` IS NULL) LEFT OUTER JOIN `users` AS `messages->user` ON `messages`.`userId` = `messages->user`.`id` AND (`messages->user`.`deletedAt` IS NULL) WHERE (`ticket`.`deletedAt` IS NULL);
Executing (9ee9ddaa-294e-41d1-9e03-9f02a2737030): COMMIT;

-- POST '/api/ticket

exports.addMessage = async (req, res) => {
  try {
    const result = await sequelize.transaction(async (t) => {
      var ticketId = req.body.ticketId;
      const userId = req.body.userId;
      const message = req.body.message;
      const subject = req.body.subject;

      // Validate input - If new ticket, a subject must be provided
      if (!ticketId && !subject) {
        return res
          .status(400)
          .send({ message: "New ticket must have a subject" });
      }
      // Validate input - If ticket exists, userId and message must be provided
      if (!userId && !message && ticketId) {
        return res
          .status(400)
          .send({ message: "UserID and message are required" });
      }
      // Create ticket is no ticketID was provided
      if (!ticketId) {
        const [ticket, created] = await Ticket.findOrCreate({
          where: {
            subject: subject,
            userId: userId,
          },
          transaction: t,
        });
        ticketId = ticket.id;
      }
      // Create a new message object
      const messageObject = await db.message.create(
        {
          message: message,
          userId: userId,
          ticketId: ticketId,
        },
        { transaction: t }
      );
      // Output message object
      return res.send(messageObject);
    });
  } catch (err) {
    console.log(err);
    return res.status(500).send({
      message:
        err.message || "Some error occurred while creating the ticket message.",
    });
  }
};

-- 获取:api/ticket

exports.findAll = async (req, res) => {
  try {
    const result = await sequelize.transaction(async (t) => {
      const tickets = await db.ticket.findAll(
        {
          include: [{ model: db.message, include: [db.user] }],
        },
        { transaction: t }
      );
      tickets.forEach((ticket) => {
        console.log(JSON.stringify(ticket.messages.length));
      });

      return res.send(tickets);
    });
  } catch (err) {
    console.log(err);
    res.status(500).send({
      message: err.message || "Some error occurred while retrieving Tickets.",
    });
  }
};

您在事务实际提交之前向客户端发送了响应。 你只需要移动res.send(messageObject); 在交易调用之外。
如果您添加几个带有消息的console.log以查看实际操作顺序是什么,您可以尝试查看当前版本代码中发生了什么(我的意思是 POST 中的几条消息(交易中的最后一条语句和之后res.send之前的事务)和至少一个在 GET 开头的事务)。

实际上,如果事务被回滚,您将发送一个未提交且已删除的对象/记录,我认为这不是您的目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM