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

问题描述

我目前正在学习 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));
});

但是,如果您有多个 then 相互嵌套,那么调试将非常困难:

  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 });
    }
}

有关详细信息,我建议您阅读此link