Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确保某些JavaScript代码仅在异步/等待数据库插入成功时执行?_Javascript_Node.js_Express - Fatal编程技术网

如何确保某些JavaScript代码仅在异步/等待数据库插入成功时执行?

如何确保某些JavaScript代码仅在异步/等待数据库插入成功时执行?,javascript,node.js,express,Javascript,Node.js,Express,我有一个后端功能,负责产品创建。现在,这个函数完成了它的工作,但是它没有错误处理,我正试图找出如何雄辩地做到这一点 这是将产品记录插入数据库的代码部分: let product = await Product.create({ name: name, description: description, price: price, manufacturer: manufacturer, serialNumber: serialNumber, imag

我有一个后端功能,负责产品创建。现在,这个函数完成了它的工作,但是它没有错误处理,我正试图找出如何雄辩地做到这一点

这是将产品记录插入数据库的代码部分:

let product = await Product.create({
    name: name,
    description: description,
    price: price,
    manufacturer: manufacturer,
    serialNumber: serialNumber,
    image: imageUrl,
    categoryId: categoryId
})
这段代码只能在产品插入数据库成功的情况下运行,所以我想知道如何确保它只在产品插入确实成功的情况下执行

Jimp.read(file.buffer)
.then(image => {
    return image
    .resize(Jimp.AUTO, 200)
    .write('public/images/products/' + imageName);
})
.catch(err => {
    console.error(err);
});

models.forEach((model, i) => {
    model.addProduct(product)
});

brands.forEach((brand, i) => {
    brand.addProduct(product)
});
我很好奇代码中是否还有其他部分可能需要一些错误处理,而我可能没有看到

整体功能

module.exports.createProduct = async (req, res, next) => {
    let name = req.body.name
    let description = req.body.description
    let price = req.body.price
    let manufacturer = req.body.manufacturer
    let serialNumber = req.body.serialNumber
    let categoryId = req.body.categoryId
    let brandsIds = JSON.parse(req.body.brands)
    let modelsIds = JSON.parse(req.body.models)
    let file = req.file
    let imageName = uuidv4() + ".png"
    let imageUrl = req.protocol + '://' + req.get('host') + '/images/products/' + imageName

    let models = await Model.findAll({
        where: {
            id: modelsIds
        }
    });

    let brands = await Brand.findAll({
        where: {
            id: brandsIds
        }
    });

    let product = await Product.create({
        name: name,
        description: description,
        price: price,
        manufacturer: manufacturer,
        serialNumber: serialNumber,
        image: imageUrl,
        categoryId: categoryId
    })

    Jimp.read(file.buffer)
    .then(image => {
        return image
        .resize(Jimp.AUTO, 200)
        .write('public/images/products/' + imageName);
    })
    .catch(err => {
        console.error(err);
    });

    models.forEach((model, i) => {
        model.addProduct(product)
    });

    brands.forEach((brand, i) => {
        brand.addProduct(product)
    });

    res.status(200).json({
        product: product
    })
}

如果
Product.create
promise拒绝(我假设如果与数据库的连接失败,也可能是因为某种原因,比如唯一Id冲突),那么代码将抛出

您的代码中没有使用
try/catch
处理异常,因此此代码块的执行将停止,异常将传播到封闭范围


因此,如果创建失败,它就不会运行。

如果
Product.create
promise拒绝了(我假设如果与数据库的连接失败,也可能是唯一Id冲突),那么代码将抛出

您的代码中没有使用
try/catch
处理异常,因此此代码块的执行将停止,异常将传播到封闭范围


因此,如果创建失败,它将不会运行。

您正在使用异步等待函数:


let product=wait product.create
您正在使用异步等待函数:


let product=await product.create
出于好奇,我是否可以/应该将let models=await Model.findAll()、let brands=await Brand.findAll()和let product=await product.create()捆绑在一个try/catch块中,还是每个模块都有自己的try/catch块?您只需要一个try/catch块,将所有代码放入try块中,所有可能发生的错误都将由catch块处理出于好奇,我是否可以/应该在单个try/catch块中捆绑let models=wait Model.findAll()、let brands=wait Brand.findAll()和let product=wait product.create(),或者它们中的每一个都应该有自己的try/catch块吗?您只需要一个try/catch块,将所有代码放在try块中,所有可能发生的错误都将由catch块处理