简体   繁体   中英

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? 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.

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");
        }
      }
    );
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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