Optimieren Sie SQL-Transaktionen in der API
P粉343408929
P粉343408929 2023-08-18 13:24:59
0
1
486
<p>Ich hatte kürzlich ein Vorstellungsgespräch und habe ein paar Hausaufgaben bekommen. Dann erhielt ich die Rückmeldung, dass mein Update-Endpunkt eine unnötige Kombination aus Abfragen und Transaktionen enthielt. </p> <pre class="brush:php;toolbar:false;">export const update = async (req: Request, res: Response, next: NextFunction) => versuchen { const reportId = parseInt(req.params.id) const { Name, Alter, Info } = req.body const report = waiting ReportModel.findOne({ Wo: { id: reportId } }) if (!report) return next(new EntityNotExistError("Bericht existiert nicht")) warte auf ReportModel.update({ Name, Alter, die Info }, { Wo: { id: reportId } }) const _report = waiting ReportModel.findOne({ Wo: { id: reportId } }) return res.json({ Meldung: „Bericht erfolgreich bearbeitet“, Bericht: _report }) } Catch (Fehler) { return next(error) } }</pre> <p>Wie Sie sehen können, prüft die erste Abfrage, ob die Entität existiert, dann führe ich eine Aktualisierung der Entität durch und die letzte Abfrage gibt die aktualisierte Entität zurück. Gibt es eine Möglichkeit, die Kommunikation mit der Datenbank zu optimieren? </p>
P粉343408929
P粉343408929

Antworte allen(1)
P粉201448898

您的代码涉及到对数据库的三个不同交互,用于单个更新操作:

  1. 检查实体是否存在 | 代码:ReportModel.findOne()
  2. 更新实体 | 代码:ReportModel.update()
  3. 获取更新后的实体,以便在响应中返回 | 代码:ReportModel.findOne()

减少数据库查询可以完成任务并提高性能。

**您修复后的代码:**

export const update = async(req: Request, res: Response, next: NextFunction) => {
  try {
    const reportId = parseInt(req.params.id);
    const {
      name,
      age,
      info
    } = req.body;

    // 执行更新并获取受影响的行数
    const [numberOfAffectedRows] = await ReportModel.update({
      name,
      age,
      info
    }, {
      where: {
        id: reportId
      },
      // 此标志检查更新函数是否返回更新后的对象
      returning: true
    });

    // 检查实体是否被找到和更新
    if (numberOfAffectedRows === 0) {
      return next(new EntityNotExistError("报告不存在"));
    }

    // 获取更新后的报告
    const updatedReport = await ReportModel.findOne({
      where: {
        id: reportId
      }
    });

    return res.json({
      message: "报告已成功编辑",
      report: updatedReport
    });

  } catch (error) {
    return next(error);
  }
}
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage