节点:如何编写路由控制器



我目前正在学习MERN,在学习了一些教程后,我想知道关于后端路由设置的最佳实践是什么。

  1. 将路由与其逻辑分开真的有用/重要吗
  2. 关于控制器的最佳实践是什么(这就是老师所说的路由逻辑(
(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 });
}
}

有关更多详细信息,我建议您浏览此链接。

最新更新