我目前正在学习MERN,在学习了一些教程后,我想知道关于后端路由设置的最佳实践是什么。
- 将路由与其逻辑分开真的有用/重要吗
- 关于控制器的最佳实践是什么(这就是老师所说的路由逻辑(
(req, res) => {
Exercise.find()
.then(exercises => res.json(exercises))
.catch(err => res.status(400).json('Error: ' + err));
});
或
(req, res) => {
try {
const exercises = Exercises.find();
res.status(200).json(exercises);
} catch {
res.status(404).json({ message: error.message });
}
}
将路由与其逻辑分离真的有用/重要吗?
我不打算详述。但是,控制器、路由配置和视图的概念有助于显示职责的明确分离。路由配置负责初始化路由并将其与控制器关联。控制器负责从路由中获取输入并调用适当的操作来执行。如果该特定控制器负责API端点,则这些操作可以是任何操作,例如涉及呈现视图或调用服务。
关于控制器的最佳实践是什么(老师调用了路由上的逻辑(
如果你遵循推荐的使用任何东西的做法,没有最好或最坏的写作方式。
例如,只要你使用一个或两个then,如果有任何错误,你实际上可以调试,而且它是可读的:
(req, res) => {
Exercise.find()
.then(exercises => res.json(exercises))
.catch(err => res.status(400).json('Error: ' + err));
});
但是,如果你有几个嵌套在一起,那么调试起来就很困难了:
Exercise.find()
.then(exercises => {res.json(exercises)
})
.then(exercises => {res.json(exercises);
.// more steps to get the final values.
.
.then(exercises => {res.json(exercises);
.catch(err => res.status(400).json('Error: ' + err));
现在,这段代码:
(req, res) => {
try {
const exercises = Exercises.find();
res.status(200).json(exercises);
} catch {
res.status(404).json({ message: error.message });
}
}
您将无法在exercises
中获得值,因为这是一个必须解决或拒绝才能获得值的承诺。此外,try/catch在这里不起作用,因为这是异步代码,您将无法捕获错误。要检查错误和值,您需要使用上面的then/catch表示法。
然而,我们可以通过使用async/await来简化现有的代码,您可以使用try/catch:
async (req, res) => {
try {
const exercises = await Exercises.find();
res.status(200).json(exercises);
} catch {
res.status(404).json({ message: error.message });
}
}
有关更多详细信息,我建议您浏览此链接。