为了更好的组织代码,将 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 实例写的会比较重复,这是个不好的做法,可能会因为输入错误而导致一些不必要的错误,可以通过下面的方法可以有效的避免重复录入:
- 使用 Router 的实例方法链式连接 get / post 等
- 在特定的路由上安装中间件
将 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'));
以上这种模块化的路由是比较安全的做法,而且,在页面上不会看起来太乱。