简体   繁体   English

避免在 node.js 中嵌套 SQL 查询

[英]Avoid nested SQL query in node.js

mysql.query(`SELECT templateCode from templates WHERE templateCode = "${templateCode}"`, (err, result) => {
            if (result.length !== 0) {
                req.session.success = false;
                req.session.message = "Template Code must be unique!";
                return res.redirect("/giftCard/templates");
            }
            mysql.query(
                `INSERT INTO outertemplateimages (outerImagePath, outerImageUrl) VALUES("${outerImageFilePath}", "${process.env.URL}${outerImageFilePath}")`,
                async (err, { insertId: outerImageId }) => {
                    mysql.query(
                        `INSERT INTO innertemplateimages (innerImagePath, innerImageUrl) VALUES("${innerImageFilePath}", "${process.env.URL}${innerImageFilePath}")`,
                        async (err, { insertId: innerImageId }) => {
                            mysql.query(
                                `INSERT INTO templates (templateName, templateCode, outerImage, innerImage) VALUES("${templateName}", "${templateCode}", ${outerImageId}, ${innerImageId})`,
                                (err, result) => {
                                    if (!err) {
                                        req.session.success = true;
                                        req.session.message = "New Template is added successfully";
                                        res.redirect("/giftCard/templates");
                                    }
                                }
                            );
                        }
                    );
                }
            );
        });

As the title mentioned, is there any way to write non-nested SQL query in node.js?正如标题所提到的,有没有办法在node.js 中编写非嵌套SQL 查询? What the query return is not the result.查询返回的不是结果。 Anyone has the idea on it?任何人都有这个想法?

By using a node module that supports a Promise API for MySQL.通过使用支持 MySQL 的 Promise API 的节点模块。

Or by not nesting the callbacks, and using named functions instead:或者不嵌套回调,而是使用命名函数:

function(req, res, next) {

  mysql.query(`SELECT templateCode from templates WHERE templateCode = "${templateCode}"`, processTemplateCodes);

  function processTemplateCodes(err, result) {
    if (result.length !== 0) {
      req.session.success = false;
      req.session.message = "Template Code must be unique!";
      return res.redirect("/giftCard/templates");
    }
    mysql.query(
      `INSERT INTO outertemplateimages (outerImagePath, outerImageUrl) VALUES("${outerImageFilePath}", "${process.env.URL}${outerImageFilePath}")`,
       outerTemplateImageInserted);
  }


  function outerTemplateImageInserted(err, {
    insertId: outerImageId
  }) {
    mysql.query(
      `INSERT INTO innertemplateimages (innerImagePath, innerImageUrl) VALUES("${innerImageFilePath}", "${process.env.URL}${innerImageFilePath}")`,
      innerTemplateImageInserted);
  }

  function innerTemplateImageInserted(err, {
    insertId: innerImageId
  }) {
    mysql.query(
      `INSERT INTO templates (templateName, templateCode, outerImage, innerImage) VALUES("${templateName}", "${templateCode}", ${outerImageId}, ${innerImageId})`,
      (err, result) => {
        if (!err) {
          req.session.success = true;
          req.session.message = "New Template is added successfully";
          res.redirect("/giftCard/templates");
        }
      }
    );
  }
}

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

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