如何从MongoDB获取所有用户?后端接口实现求助
解决方案
步骤1:在mainController中添加获取所有用户的方法
在控制器的导出对象里新增getAllUsers方法,同时修正现有updateUser方法里的错误(原代码误用了未定义的User,应改为UserSchema):
getAllUsers: async (req, res) => { try { // 用find()获取所有用户,排除password字段避免泄露敏感信息 const users = await UserSchema.find({}, { password: 0 }); return res.send({ error: false, message: '所有用户数据获取成功', data: users }); } catch (error) { return res.send({ error: true, message: '获取用户数据失败', data: null }); } }
步骤2:在mainRouter中注册新接口路由
先更新控制器的导入语句,加入getAllUsers,再添加对应的GET路由:
// 导入部分新增getAllUsers const { login, register, getSingleUser, updateUser, getAllUsers } = require("../controller/mainController") // 添加路由 mainRouter.get('/users', getAllUsers);
完整修改后的代码
修改后的mainController
const uid = require('uid-safe') const bcrypt = require('bcrypt') const UserSchema = require('../schemas/UserSchema'); const { default: mongoose } = require('mongoose'); module.exports = { register: async (req, res) => { const { username, email, password, image, city, country, firstName, lastName, phone, gender, birth } = req.body; const userExists = await UserSchema.findOne({ username }); if (userExists) { return res.send({ error: true, message: 'User with this username exists', data: null }); } const emailExists = await UserSchema.findOne({ email }); if (emailExists) { return res.send({ error: true, message: 'User with this email exists', data: null }); } const id = await uid(7); const hashedPass = await bcrypt.hash(password, 3); const user = new UserSchema({ secret: id, username, email, password: hashedPass, image, city, country, firstName, lastName, phone, gender, birth }); await user.save(); return res.send({ error: false, message: 'User successfully registrated!', data: null }); }, login: async (req, res) => { const { username, password } = req.body; const loginUser = await UserSchema.findOne({ username }); if (loginUser) { const passMatch = bcrypt.compare(password, loginUser.password) if (passMatch) { return res.send({ error: false, message: `Welcome back ${username}!`, data: loginUser }) } return res.send({ error: true, message: 'Invalid password', data: null }); }; return res.send({ error: true, message: 'Invalid username', data: null }); }, getSingleUser: async (req, res) => { const { secret } = req.params; const findUser = await UserSchema.findOne({ secret }); if (findUser) { return res.send({ error: false, message: 'User found', data: findUser }); } return res.send({ error: true, message: 'User not found', data: null }); }, updateUser: async (req, res) => { try { // 修正:将User改为UserSchema const updateduser = await UserSchema.updateOne({ secret: req.params.secret }, { $set: req.body }); res.status(200).json(updateduser); } catch (error) { res.status(400).json({ message: error.message }); } }, getAllUsers: async (req, res) => { try { // 排除password字段,保护敏感数据 const users = await UserSchema.find({}, { password: 0 }); return res.send({ error: false, message: '所有用户数据获取成功', data: users }); } catch (error) { return res.send({ error: true, message: '获取用户数据失败', data: null }); } } };
修改后的mainRouter
const express = require('express') const { login, register, getSingleUser, updateUser, getAllUsers } = require("../controller/mainController") const { loginValidate, registerValidate } = require("../middleware/authValidator") const mainRouter = express.Router() mainRouter.post('/register', registerValidate, register); mainRouter.post('/login', loginValidate, login); mainRouter.get('/user/:secret', getSingleUser); // 新增获取所有用户的路由 mainRouter.get('/users', getAllUsers); module.exports = mainRouter;
额外提示
- 如果需要分页或筛选用户,可以在
find()中添加参数,比如UserSchema.find({}, { password:0 }).skip(0).limit(10)实现分页。 - 生产环境建议给这个接口加权限验证,防止未授权访问。
内容的提问来源于stack exchange,提问作者Paulius
相关产品推荐
相关产品推荐

