如何确保某些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块处理