如何在NodeJS中使用async和wait进行CRUD



我必须创建CRUD,但我的控制器使用了很多回调。我不知道如何使用asyncawait来使我的代码看起来干净和高性能。我希望任何人都能帮助我,给我一些建议。

下面是我的控制器:

// create new course
export function createCourse (req, res) {
const course = new Course({
_id: mongoose.Types.ObjectId(),
title: req.body.title,
description: req.body.description,
});

return course
.save()
.then((newCourse) => {
return res.status(201).json({
success: true,
message: 'New course created successfully',
Course: newCourse,
});
})
.catch((error) => {
console.log(error);
res.status(500).json({
success: false,
message: 'Server error. Please try again.',
error: error.message,
});
});
}
// Get all course
export function getAllCourse( req, res){
Course.find()
.select('_id title description')
.then((allCourse) => {
return res.status(200).json({
success: true,
message: 'A list of all course',
Course: allCourse,
});
})
.catch((err) => {
res.status(500).json({
success: false,
message: 'Server error. Please try again.',
error: err.message,
});
});
}
// get single course
export function getSingleCourse(req, res) {
const id = req.params.courseId;
Course.findById(id)
.then((singleCourse) => {
res.status(200).json({
success: true,
message: `More on ${singleCourse.title}`,
Course: singleCourse,
});
})
.catch((err) => {
res.status(500).json({
success: false,
message: 'This course does not exist',
error: err.message,
});
});
}
// update course
export function updateCourse(req, res) {
const id = req.params.courseId;
const updateObject = req.body;
Course.update({ _id:id }, { $set:updateObject })
.exec()
.then(() => {
res.status(200).json({
success: true,
message: 'Course is updated',
updateCourse: updateObject,
});
})
.catch((err) => {
res.status(500).json({
success: false,
message: 'Server error. Please try again.'
});
});
}
// delete a course
export function deleteCourse(req, res) {
const id = req.params.courseId;
Course.findByIdAndRemove(id)
.exec()
.then(()=> res.status(204).json({
success: true,
}))
.catch((err) => res.status(500).json({
success: false,
}));
}

现在我想用async和wait替换所有回调,如何替换以及如何更正确地使用它们。我感谢每一次帮助。

// create new course
export async function createCourse(req, res) {
const course = new Course({
_id: mongoose.Types.ObjectId(),
title: req.body.title,
description: req.body.description,
});
try {
let newCourse = await course.save();
return res.status(201).json({
success: true,
message: 'New course created successfully',
Course: newCourse,
});
} catch (error) {
console.error(error);
return res.status(500).json({
success: false,
message: 'Server error. Please try again.',
error: error.message,
});
}
}
// Get all course
export async function getAllCourse(req, res) {
try {
let allCourse = await Course.find().select('_id title description');
return res.status(200).json({
success: true,
message: 'A list of all course',
Course: allCourse,
});
} catch (error) {
return res.status(500).json({
success: false,
message: 'Server error. Please try again.',
error: error.message,
});
}
}

您使用的是promise,它们用于避免回调地狱。这只是调用回调的一种方式:当你使用回调时,你在任务完成时传递cb函数,另一方面,它承诺返回你附加回调的对象,因此没有回调地狱。

在给定的问题中,您也使用了很好的cbs的链接,async/await并不是魔法,它们只是Promises上的语法糖。它们使代码更具可读性和可维护性。

让我们以createCourse:为例

export async function createCourse (req, res) {
try {
const course = new Course({
_id: mongoose.Types.ObjectId(),
title: req.body.title,
description: req.body.description,
});

const course = await course.save()
res.status(201).json({
success: true,
message: 'New course created successfully',
course,
})
} catch (error) {
console.log(error);
res.status(500).json({
success: false,
message: 'Server error. Please try again.',
error: error.message,
});
}
}

注意:始终将try/catch与async/await 一起使用

你可以对所有其他承诺采取同样的方法。我建议您查看此以了解更多详细信息。

// Find all car with condition
export async function findAllCar(req, res) {
const { page, size, name, color, brand } = req.query;
const { limit, offset } = getPagination(page, size);
var condition =
name && color && brand
? {
name: { [Op.iLike]: `%${name}%` },
color: { [Op.iLike]: `%${color}%` },
brand: { [Op.iLike]: `%${brand}%` },
}
: null;
try {
const car = await Car.findAll({ where: condition, offset, limit });
if (!car) {
return res.status(404);
}
const response = getPagingData(data, page, limit);
res.status(200).send(response);
} catch (error) {
return res.status(500).json({
success: false,
message: "Server error. Please try again.",
error: error.message,
});
}
}
// Find single Car
export async function findOne(req, res) {
try {
const car = await Car.findById(req.params.car_id);
if (!car) {
return res.status(404);
}
res.status(200).send(car);
} catch (error) {
return res.status(500).json({
success: false,
message: "Server error. Please try again.",
error: error.message,
});
}
}
// update car
export async function updateCar(req, res) {
try {
const car = await Car.find(
req.body.name,
req.body.brand,
req.params.car_id,
req.body
);
if (!car) {
return res.status(404).json({
success: false,
message: "Duplicate value.",
});
}
res.status(200).json({
success: true,
message: "New car updated successfully",
});
} catch (error) {
return res.status(500).json({
success: false,
message: "Server error. Please try again.",
error: error.message,
});
}
}
// delete a car
export async function deleteCar(req, res) {
try {
const car = await Car.findByIdAndDelete(req.params.car_id);
if (!car) {
return res.status(404).send();
}
res.send(car);
} catch (error) {
return res.status(500).json({
success: false,
message: "Server error. Please try again.",
error: error.message,
});
}
}

最新更新