MST

星途 面试题库

面试题:Node.js Express模块化项目结构之基础模块拆分

在Node.js Express的模块化项目结构设计中,假设你要开发一个简单的用户管理模块,包含用户注册、登录功能。请描述如何进行模块拆分,每个模块的职责是什么,并且用代码示例展示模块间如何相互调用。
34.2万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

模块拆分及职责

  1. 路由模块(routes/userRoutes.js)
    • 职责:负责定义与用户管理相关的HTTP路由,接收客户端请求,并将请求转发给对应的控制器方法。
  2. 控制器模块(controllers/userController.js)
    • 职责:处理业务逻辑,如用户注册和登录逻辑。与数据库交互(假设存在数据库操作),验证输入数据等。
  3. 服务模块(services/userService.js)
    • 职责:封装具体的业务操作,如用户注册、登录的核心算法。可以包含密码加密、用户数据查询等操作。
  4. 数据库模块(假设使用mongoose连接MongoDB,models/userModel.js)
    • 职责:定义用户数据的模型结构,提供数据库操作方法,如保存用户、查找用户等。

代码示例

  1. 数据库模块(models/userModel.js)
const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
    username: String,
    password: String
});

module.exports = mongoose.model('User', userSchema);
  1. 服务模块(services/userService.js)
const User = require('../models/userModel');
const bcrypt = require('bcrypt');

const registerUser = async (username, password) => {
    const hashedPassword = await bcrypt.hash(password, 10);
    const newUser = new User({ username, password: hashedPassword });
    return newUser.save();
};

const loginUser = async (username, password) => {
    const user = await User.findOne({ username });
    if (user) {
        const isMatch = await bcrypt.compare(password, user.password);
        if (isMatch) {
            return user;
        }
    }
    return null;
};

module.exports = {
    registerUser,
    loginUser
};
  1. 控制器模块(controllers/userController.js)
const { registerUser, loginUser } = require('../services/userService');

const register = async (req, res) => {
    const { username, password } = req.body;
    try {
        const user = await registerUser(username, password);
        res.status(201).json({ message: 'User registered successfully', user });
    } catch (error) {
        res.status(500).json({ error: 'Registration failed' });
    }
};

const login = async (req, res) => {
    const { username, password } = req.body;
    try {
        const user = await loginUser(username, password);
        if (user) {
            res.status(200).json({ message: 'Login successful', user });
        } else {
            res.status(401).json({ error: 'Invalid credentials' });
        }
    } catch (error) {
        res.status(500).json({ error: 'Login failed' });
    }
};

module.exports = {
    register,
    login
};
  1. 路由模块(routes/userRoutes.js)
const express = require('express');
const router = express.Router();
const { register, login } = require('../controllers/userController');

router.post('/register', register);
router.post('/login', login);

module.exports = router;
  1. 主应用文件(app.js)
const express = require('express');
const userRoutes = require('./routes/userRoutes');
const app = express();
app.use(express.json());
app.use('/users', userRoutes);

const port = 3000;
app.listen(port, () => {
    console.log(`Server running on port ${port}`);
});