Как преобразовать код экспресс / nodejs из ада обратного вызова в обещание - PullRequest
0 голосов
/ 12 октября 2018

пожалуйста.Помоги мне.Мне это действительно нужно.У меня есть только 8 часов, чтобы переписать мой код 2500 строк кода, иначе я потерплю неудачу в своей теме.

Я использую 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 Ответ

0 голосов
/ 12 октября 2018

сначала вам нужно использовать класс Promise и передать ему функцию, эта функция получает два параметра: первый - один в resolve, а второй - reject.в теле функции мы запускаем нашу функцию callback-based и при обратном вызове проверяем, есть ли какая-либо ошибка, мы вызываем функцию reject и передаем error, а если ошибки нет, мы вызываем resolve и передаемрезультат.поэтому мы создаем Promise, теперь нам нужно его использовать.для этого мы вызываем переменную .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
    })
   }
})
...