继续上篇内容,我们来优化一下我们的后端代码,添加错误处理,增强安全性,添加用户管理和权限控制。
错误处理:
我们可以添加一个全局错误处理器来捕获和处理所有未处理的错误。以下是如何在Express中添加一个错误处理器:
// 在所有路由之后添加 app.use((err, req, res, next) => { console.error(err.stack); res.status(500).send({ message: 'An error occurred' }); });
增强安全性:
- 限制请求速率:我们可以使用如
express-rate-limit
的库来限制每个IP的请求速率,以防止暴力破解。 - 增强密码安全性:使用更复杂的哈希算法,例如argon2,并增加密码复杂度的要求。
- HTTPS:在生产环境中,应该使用HTTPS来加密传输的数据。
- 隐藏错误详情:在生产环境中,应该隐藏错误详情,只返回错误码和通用的错误消息,防止敏感信息泄漏。
用户管理和权限控制:
我们可以添加新的路由来管理用户,例如获取用户列表、修改用户信息、删除用户等。并且,我们可以通过JWT的payload来存储用户的角色信息,然后在路由处理器中根据用户的角色来决定是否允许进行某个操作。以下是一些示例代码:
// server.js // 添加角色到用户数据模型 const userSchema = new mongoose.Schema({ username: String, password: String, phone: String, role: { type: String, default: 'user' } // 默认为'user' }); // ... // 用户登录时添加角色到JWT的payload const token = jwt.sign({ id: user.id, role: user.role }, 'secret'); // ... // 添加一个中间件来验证用户的角色 function requireRole(role) { return (req, res, next) => { if (req.user.role !== role) { return res.status(403).send({ message: 'Forbidden' }); } next(); }; } // 添加新的路由来管理用户,只有管理员可以访问 app.get('/api/users', requireRole('admin'), async (req, res) => { const users = await User.find(); res.send(users); }); app.delete('/api/users/:id', requireRole('admin'), async (req, res) => { await User.findByIdAndDelete(req.params.id); res.send({ message: 'User deleted' }); });
以上的代码是对现有功能的一些基本优化,还有很多细节和其他功能需要你去完善和实现。后续我们专栏将更新更复杂的权限控制(每个用户可能有多个角色,每个角色有不同的权限等)、用户的密码找回和更改、用户的个人信息管理等功能。