【问题标题】:How to make node js controller not so messy?如何让 node js 控制器不那么凌乱?
【发布时间】:2022-07-20 00:50:01
【问题描述】:

我正在制作我的 nodeJs 应用程序,我意识到我的控制器有点乱,所以我尝试通过创建各种函数来分解逻辑,但是当我看到结果时,我觉得我的代码有问题? ??????我的意思是,可以在另一个异步函数中使用异步函数,还是按照我使用它们的方式使用异步函数。任何人都可以进行一些代码审查,我将不胜感激。

从“快递”进口{请求,响应}; 从“bcrypt”导入 bcrypt 从“../../models/Role.js”导入角色; 从“../../models/User.js”导入用户; 导出默认类 UserControler { public async createUser(req: Request, res: Response): Promise{ 尝试 { 异步函数getHashedPassword(密码:任意):承诺{ 常量盐:字符串 = 等待 bcrypt.genSalt(10); const hashedPassword: string = await bcrypt.hash(password, salt); 返回散列密码 }; 异步函数 getDefaultRoleId(): Promise { const [roleData, createdRole] = await Role.findOrCreate({ 在哪里: { 名称:'用户', }, 默认值:{ 名称:'用户' } }); const roleId: string = roleData.getDataValue('_id'); 返回角色 ID }; 异步函数 emailExists(email: string): Promise { const user = await User.findOne({ 在哪里: { 电子邮件:电子邮件, } }); 如果(用户){ 返回真 } 否则 {返回 false;} }; const _emailExists: boolean = await emailExists(req.body.email) if(_emailExists) return res.status(400).json({exists: true}); 等待用户创建({ 角色:等待 getDefaultRoleId(), 电子邮件:req.body.email, 隐藏:假, 密码:await getHashedPassword(req.body.password) }).then((数据) => { res.json({数据:数据}); }) } 捕捉(错误:任何){ res.status(400).json({error: err}); } } }

【问题讨论】:

    标签: node.js typescript


    【解决方案1】:

    首先,我鼓励你遵循services的创建实践。我可以从您的代码中看到您已经有了controllermodels。您唯一缺少的是services。您可以将所有逻辑移至服务文件,并使控制器尽可能精简。

    示例实现:
    // userController.ts file
    import { Request, Response } from "express";
    import { emailExists } from "./userService";
    
    export default class UserController {
      public async createUser(req: Request, res: Response): Promise {
        try {
          const { email, password } = req.body;
          const _emailExists: boolean = await emailExists(email);
          if (_emailExists) return res.status(400).json({ exists: true });
    
          const user = await createUser(email, password);
          res.json({ data: user });
        } catch (err: any) {
          res.status(400).json({ error: err });
        }
      }
    }
    

    现在创建一个userService.ts 文件,export 方法,然后在主控制器文件中引用所需的方法。

    // userService.ts
    import bcrypt from "bcrypt";
    import Role from "../../models/Role.js";
    import User from "../../models/User.js";
    
    export const createUser = async (
      email: string,
      password: string
    ): Promise<User> => {
      return User.create({
        role: await getDefaultRoleId(),
        email,
        hidden: false,
        password: await getHashedPassword(password),
      });
    };
    
    export const getHashedPassword = async (password: any): Promise<string> => {
      const salt: string = await bcrypt.genSalt(10);
      const hashedPassword: string = await bcrypt.hash(password, salt);
    
      return hashedPassword;
    };
    
    export const getDefaultRoleId = async (): Promise<string> => {
      const [roleData, createdRole] = await Role.findOrCreate({
        where: {
          name: "User",
        },
        defaults: {
          name: "User",
        },
      });
      const roleId: string = roleData.getDataValue("_id");
      return roleId;
    };
    
    export const emailExists = async (email: string): Promise<boolean> => {
      const user = await User.findOne({ where: { email: email } });
      if (user) return true;
      return false;
    };
    
    

    【讨论】:

      猜你喜欢
      • 2013-12-21
      • 2011-09-02
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      相关资源
      最近更新 更多