如何与数组的循环配合使用链接的诺言?

问题描述 投票:1回答:2

所以,我有这样的代码。我想永远调试进去。我不知道为什么它返回错误。我可能有承诺的一些元素我忘了或我有我的Array.push“事业不对劲时,我看日志,它抛出就行,我推一些对象到数组错误。

这是我到目前为止的代码:

router.post('/inventory/product/stocks/add/(:id)', authenticationMiddleware(), function(req, res, next) {
const db = require('../db.js')

var product_no = req.params.id
var cog = req.body.cog
var size_slug = req.body.size_slug
var size_name = req.body.size_name
var rowinserted = 0
var initial_stock = req.body.initial_stock
var stock_id = new Array
var batch_id = new Array
var stock = new Array
var batch = new Array

new Promise(function(resolve, reject) {
    console.log('one');
    // Getting product product_slug for product_sku

    let sql = `SELECT product_slug
               FROM inventory_tbl
               WHERE product_no = ?`

    db.query(sql, [req.params.id], (error, results, fields) => {
        if (error) {
            throw error;
        } else {
            var product_slug = results[0].product_slug
            resolve(product_slug)
        }
    })
})
.then(function(value) {
    console.log('two');
    // Insert product sizes together with its initial stock

    for (var x = 0; x < size_slug.length; x++) {
        var product_sku = value + size_slug[x]
        var slug = size_slug[x]
        var name = size_name[x]
        var initial_stock = initial_stock[x]
        console.log(product_sku);
        if (size_slug[x] != '') {
            stock.push({
                product_sku: product_sku,
                product_no: product_no,
                size_slug: slug,
                size_name: name,
                total_stock: initial_stock,
                available_stock: initial_stock
            })
        }
        console.log(stock);
    }

    for (var x = 0; x < size_slug.length; x++) {
        var product_sku = value + size_slug[x]
        var initial_stock = initial_stock[x]
        if (size_slug[x] != '') {
            batch.push({
                product_no: product_no,
                product_sku: product_sku,
                production_date: mysql.raw('CURRENT_TIMESTAMP'),
                batch_cog: cog,
                initial_stock: initial_stock,
                stock_left: initial_stock
            })
        }
        console.log(batch);
    }

    return value
})
.then(function(value) {
    console.log('three');
    // Insert rows to product_tbl and stock_tbl

    for (var i = 0; i < stock.length; i++) {
        let sql = `INSERT INTO product_tbl(product_sku, product_no, size_slug, size_name, total_stock, available_stock) VALUES (?, ?, ?, ?, ?, ?)`

        db.query(sql, [stock[i].product_sku, req.params.id, stock[i].size_slug, stock[i].size_name, stock[i].total_stock, stock[i].available_stock], (error, results, fields) => {
            if (error) throw error
            db.query(`SELECT LAST_INSERT_ID() AS id;`, (error, results, fields) => {
                stock_id[i] = results[0].id
            })
        })

        sql = `INSERT INTO stocks_tbl(product_no, product_sku, production_date, batch_cog, initial_stock, stock_left) VALUES (?, ?, CURRENT_DATE, ?, ?, ?)`

        db.query(sql, [req.params.id, batch[i].product_sku, batch[i].batch_cog, batch[i].initial_stock, batch[i].stock_left], (error, results, fields) => {
            if (error) throw error
            db.query(`SELECT LAST_INSERT_ID() AS id;`, (error, results, fields) => {
                batch_id[i] = results[0].id
            })
        })
        rowsupdated++
    }

    return value
})
.then(function(value) {
    console.log('four');
    // Render the web page
    if (rowinserted != sizeslug.length) {
        req.flash('error', error)

        res.redirect('/admin/inventory/product/stock/add/' + req.params.id)
    } else {
        req.flash('success', 'Data added successfully!')
        res.redirect('/admin/inventory/product/stock/add/' + req.params.id)
    }
})
.catch(function(error) {
    console.log('error');
    // Error handler

    for (var i = 0; i < rowinserted; i++) {
        let sql = `DELETE FROM product_tbl WHERE product_sku = ?`

        db.query(sql, [stock_id[i]], (error, results, fields) => {
            if (error) throw error
        })

        sql = `DELETE FROM stocks_tbl WHERE product_sku = ?`

        db.query(sql, [batch_id[i]], (error, results, fields) => {
            if (error) throw error
        })
    }

    res.redirect('/admin/inventory/product/stock/add/' + req.params.id)
})
})

我数收益:

错误

编辑:该过程停止(我不知道具体的线路,但根据日志输出)的console.log后(“二”),因为我试图把一些日志,以及之后的for循环,但他们不继续存在。它只是去.catch /错误。

javascript mysql arrays node.js
2个回答
3
投票

取而代之的输出在console.log('error');字符串转储出您在error处理收到的实际catch对象。它会给的原因和位置失败的其他详细信息。我怀疑以后console.log('two');代码抛出一个异常,然后你无意中下面吞下去。

考虑分拆代码为单独的主题功能。这样,你就能够保持,并当场错误(或错别字)容易得多。


3
投票

纵观输出,我可以看到,这console.log(product_sku);不获取打印。所以,其实这个问题是var initial_stock = initial_stock[x]。你已经声明了相同名称的局部变量(你那么回调函数)为全局变量(您route.post回调函数),现在你的全局变量initial_stock被屏蔽与当地一个,这是不是一个数组(实际上是不确定的) 。因此,尝试改变变量名其他在then块的东西,看看问题消失。

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.