首页 > 解决方案 > Node:如何编写路由控制器

问题描述

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

标签: node.jsroutesmern

解决方案


将路线与其逻辑分开真的有用/重要吗?

我不打算详细介绍。但是有一个控制器、路由配置和视图的概念,有助于显示清晰的职责分离。路由配置负责初始化路由并将其与控制器关联。控制器负责从路由中获取输入并调用适当的操作来执行。如果此特定控制器负责 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 });
    }
}

有关更多详细信息,我建议您通过此链接


推荐阅读