express 将 Router 实例模块化

为了更好的组织代码,将 Router 实例进行模块化,将 get / post 等快捷方式放在Router上,而不是 App 上,然后将该 Router 作为中间件,use 到 server.js 上。

如果像这样写:

  productModule.post("/modules", (req, res) => {
    res.send("");
});

productModule.get("/modules/:id", (req, res) => {
    res.send("");
});

fruitRouter 实例写的会比较重复,这是个不好的做法,可能会因为输入错误而导致一些不必要的错误,可以通过下面的方法可以有效的避免重复录入:

  1. 使用 Router 的实例方法链式连接 get  / post 等
  2. 在特定的路由上安装中间件

将 route('/modules') 的方法写在一起

productModule.route('/modules')
    // get
    .get((req, res) => {
        productModel.find().then(module => {
            res.json(module);
        }).catch(err => {
            res.status(500).json({ message: err.message })
        });
    })
    // add
    .post((req, res) => {
        productModel.findOne({ moduleName: req.body.moduleName }).then((module) => {
            if (module) {
                return res.status(500).json({ moduleName: "moduleName 巳存在!" });
            } else {
                const moduleName = req.body.moduleName;
                const moduleClassName = req.body.moduleClassName;

                const newModule = new productModel({
                    moduleName,
                    moduleClassName
                });

                newModule.save().then(module => res.json(module)).catch(err => console.log(err));
            }
        })
    })

将参数为 id 的另一个 route('/modules/:id') 写在一起

productModule.route('/modules/:id')
    // update
    .post((req, res) => {
        const _id = `${req.params.id}`;
        const updateData = req.body;

        productModel.findByIdAndUpdate({ _id }, updateData, (err, module) => {
            if (err) {
                res.status(500).json({ error: err });
            } else {
                res.status(200).json(module)
            }
        })
    })
    // delete
    .delete((req, res) => {
        var id = `${req.params.id}`;
        console.log(id)
        productModel.findById({ _id: id }).then((id) => {
            if (id) {
                productModel.deleteOne({ _id: id }).then(module => res.status(200).json(module));
            } else {
                return res.status(400).json({ "_id": "id不存在" })
            }
        }).catch(err => {
            console.log(err)
        })
    })

最后,将这个 Router 安装在 app

app.use('/api/product', require('./routes/api/productModule'));

以上这种模块化的路由是比较安全的做法,而且,在页面上不会看起来太乱。

原文地址:https://www.cnblogs.com/baiyygynui/p/12031448.html