首页 > 解决方案 > 我在 NodeJS 中正确使用了存储库模式吗?

问题描述

我使用 Sequelize 来处理数据库。
在我的项目中,我遇到了代码重复,并决定研究存储库设计模式,它将数据库的工作和数据输出与业务逻辑分开。研究了网上的资料后,我决定整理资料,向更有经验的程序员查询。我正确使用存储库模式?控制器/user.controller.js

const userService = require('../services/user.service');

exports.userCreate = async (req, res, next) => {
 try {
   const user = await userService.userCreate(req.body);
   return res.status(201).json(user);
 } catch (e) {
   return next(e);
 }
}

服务/user.service.js

const ApiError = require('../utils/error');
const userRepo = require('../repositories/user.repository');

exports.userCreate = async (data) => {
  if (!data) throw ApiError.badRequest('Bad');

  const { login } = data;

  if (!login) throw ApiError.badRequest('Bad');
   
  const password = 'hash';
  const user = await userRepo.userCreate({login, password});
  
  return user;
}

存储库/user.repository.js

const User = require('../models/User');

exports.userCreate = async (data) => {
  const { login, passowrd } = data;
  const user = await User.create({login, password});
  
  return {
    login: user.login,
  }
}

模型/User.js

const { sequelize, Sequelize } = require('../config/db');

const User = sequelize.define('users', {
 id: {
   type: Sequelize.INTEGER,
   autoIncrement: true,
   allowNull: false,
   primaryKey: true,
 },
 login: {
  type: Sequelize.STRING,
  allowNull: false,
 },
 password: {
  type: Sequelize.STRING,
  allowNull: false,
 }
});

module.exports = User;

标签: javascriptnode.jsdesign-patternssequelize.jsrepository-pattern

解决方案


您的用户模型很好,但服务的结构似乎有点奇怪。如果 userCreates 的所有三个功能都在单独的文件中,我建议您将它们组合起来并将服务重命名为 Controller,因为服务通常在客户端使用。

服务/user.service.js

const User = require('../models/User')
// const userRepo = require('../repositories/user.repository') Not sure what this does
const ApiError = require('../utils/error')

module.exports = {
    async createUser (req, res) {
        try {
            if (!req.body) throw ApiError.badRequest('Bad')
            const { login } = req.body
            if (!login) throw ApiError.badRequest('Bad')

            const password = 'hash'
            const user = await User.create({ login, password })

            res.stauts(201).json(user.login)
        } catch (err) {
            console.log(err)
            res.staus(500).send({
                error: err
            })
            // return next(err)
        }
    }
}

推荐阅读