代码之家  ›  专栏  ›  技术社区  ›  Cheryl Blossom

如何将express/nodejs代码从回调hell转换为promise

  •  -1
  • Cheryl Blossom  · 技术社区  · 7 年前

    我使用express,mysql,nodejs

    这是我的一个示例代码,我从数据库中放入了一个新产品。

    这是我简单的“回调地狱”代码:

    router.post('/inventory/product/add', authenticationMiddleware(), function(req, res, next) {
    // Validate data
        req.assert('productslug', 'Product Slug is required').notEmpty()
        req.assert('productcat', 'Product Category is required').notEmpty()
        req.assert('productorigin', 'Product Inspiration is required').notEmpty()
        req.assert('productname', 'Product Name is required').notEmpty()
        req.assert('productprice', 'Product Price is required').notEmpty()
        req.assert('productdesc', 'Product Description is required').notEmpty()
    
        var errors = req.validationErrors()
    
        // No errors were found. Passed Validation!
        if (!errors) {
    
           var product = {
            productslug: req.sanitize('productslug').escape().trim(),
            productcat: req.sanitize('productcat').escape().trim(),
            productorigin: req.sanitize('productorigin').escape().trim(),
            productname: req.sanitize('productname').escape().trim(),
            productprice: req.sanitize('productprice').escape().trim(),
            productdesc: req.sanitize('productdesc').escape().trim()
        }
    
        const db = require('../db.js')
        let sql = `INSERT INTO inventory_tbl(product_slug, product_category, product_origin, product_name, product_price, product_cog, product_desc, total_stock) VALUES (?, ?, ?, ?, ?, ?, ?, ?);`
    
        db.query(sql, [product.productslug, product.productcat, product.productorigin, product.productname, product.productprice, 0, product.productdesc, 0], (error, results, fields) => {
            if (error) {
                req.flash('error', error)
    
                // render to views/inventory/product/add.ejs
                res.render('admin/inventory/product/add', {
                    title: 'Perry in Disguise | Add Product',
                    productslug: product.productslug,
                    productcat: product.productcat,
                    productorigin: product.productorigin,
                    productname: product.productname,
                    productprice: product.productprice,
                    productdesc: product.productdesc
                })
            } else {
                req.flash('success', 'Data added successfully!')
    
                res.render('admin/inventory/product/add', {
                    title: 'Perry in Disguise | Add Product',
                    productslug: product.productslug,
                    productcat: product.productcat,
                    productorigin: product.productorigin,
                    productname: product.productname,
                    productprice: product.productprice,
                    productdesc: product.productdesc
                })
            }
        })
    } else {
        // Display errors to the user
        var error_msg = ''
        errors.forEach(function(error) {
            error_msg += error.msg + '<br>'
        })
        req.flash('error', error_msg)
    
        // Using req.body.name
        // because req.param('name') is depreciated
        res.render('admin/inventory/product/add', {
            title: 'Perry in Disguise | Add Product',
            productslug: req.body.productslug,
            productcat: req.body.productcat,
            productorigin: req.body.productorigin,
            productname: req.body.productname,
            productprice: req.body.productprice,
            productdesc: req.body.productdesc
        })
       }
    })
    

    https://jeremysu0131.github.io/Node-js-MySQL-with-Promise-%E8%A8%AD%E5%AE%9A/

    1 回复  |  直到 7 年前
        1
  •  0
  •   Mohammad Rajabloo    7 年前

    首先,你需要使用 Promise 类并将一个函数传递给它,该函数得到两个参数,第一个是 resolve 第二个是 reject . 在函数体中,我们运行 callback-based 函数,在回调中我们检查,如果有任何错误,我们调用 拒绝 error 决定 所以我们创造了一个 承诺 .then insertresult 成功和成功的变量 .catch 出错时。

    router.post('/inventory/product/add', authenticationMiddleware(), function(req, res, next) {
    // Validate data
        req.assert('productslug', 'Product Slug is required').notEmpty()
        req.assert('productcat', 'Product Category is required').notEmpty()
        req.assert('productorigin', 'Product Inspiration is required').notEmpty()
        req.assert('productname', 'Product Name is required').notEmpty()
        req.assert('productprice', 'Product Price is required').notEmpty()
        req.assert('productdesc', 'Product Description is required').notEmpty()
    
        var errors = req.validationErrors()
    
        // No errors were found. Passed Validation!
        if (!errors) {
    
           var product = {
            productslug: req.sanitize('productslug').escape().trim(),
            productcat: req.sanitize('productcat').escape().trim(),
            productorigin: req.sanitize('productorigin').escape().trim(),
            productname: req.sanitize('productname').escape().trim(),
            productprice: req.sanitize('productprice').escape().trim(),
            productdesc: req.sanitize('productdesc').escape().trim()
        }
    
        const db = require('../db.js')
        let sql = `INSERT INTO inventory_tbl(product_slug, product_category, product_origin, product_name, product_price, product_cog, product_desc, total_stock) VALUES (?, ?, ?, ?, ?, ?, ?, ?);`
        const insertResult = new Promise((resolve, reject) => {
            db.query(sql, [product.productslug, product.productcat, product.productorigin, product.productname, product.productprice, 0, product.productdesc, 0], (error, results, fields) => {
                if (error) reject(error)
                else resolve(results)
            }
        });
        insertResult.then(result => {
                req.flash('success', 'Data added successfully!')
    
                res.render('admin/inventory/product/add', {
                    title: 'Perry in Disguise | Add Product',
                    productslug: product.productslug,
                    productcat: product.productcat,
                    productorigin: product.productorigin,
                    productname: product.productname,
                    productprice: product.productprice,
                    productdesc: product.productdesc
                })
        }).catch(error => {
                req.flash('error', error)
    
                // render to views/inventory/product/add.ejs
                res.render('admin/inventory/product/add', {
                    title: 'Perry in Disguise | Add Product',
                    productslug: product.productslug,
                    productcat: product.productcat,
                    productorigin: product.productorigin,
                    productname: product.productname,
                    productprice: product.productprice,
                    productdesc: product.productdesc
                })
        });
    } else {
        // Display errors to the user
        var error_msg = ''
        errors.forEach(function(error) {
            error_msg += error.msg + '<br>'
        })
        req.flash('error', error_msg)
    
        // Using req.body.name
        // because req.param('name') is depreciated
        res.render('admin/inventory/product/add', {
            title: 'Perry in Disguise | Add Product',
            productslug: req.body.productslug,
            productcat: req.body.productcat,
            productorigin: req.body.productorigin,
            productname: req.body.productname,
            productprice: req.body.productprice,
            productdesc: req.body.productdesc
        })
       }
    })