NodeJS 在Controllers类中绑定上下文

i34xakig  于 12个月前  发布在  Node.js
关注(0)|答案(2)|浏览(118)

我正在做一个带有UserController类的js.js项目,其中包含getAllUsers和findUserById等方法。为了在User路由器中使用这些方法,我发现自己在创建UserController示例时绑定了每个方法,以确保正确的“this”上下文(refer to this Stack Overflow question)。

// UserRouter.js

const express = require('express');
const userController = require('./UserController');

const userRouter = express.Router();

userRouter.get('/users', userController.getAllUsers.bind(userController));
userRouter.get('/users/:id', userController.findUserById.bind(userController));

module.exports = userRouter;

字符串

是否有更高效、更主流的方法来处理Cock.js UserController中的上下文绑定问题?

另一种解决方案是绑定UserController构造函数中的所有方法。然而,这种方法感觉并不干净,因为每次添加新方法时都需要修改构造函数。

// UserController.js

class UserController {
  constructor() {
    this.getAllUsers = this.getAllUsers.bind(this);
    this.findUserById = this.findUserById.bind(this);
    // more method bindings as needed
  }

  // Methods implementation
}

module.exports = UserController;

ebdffaop

ebdffaop1#

使用箭头函数而不是方法:

export default class UserController {
  constructor(dependencies) {
    this.dependencies = dependencies;
    this.getAllUsers = (req, res) => {
      // implementation
    };
    this.findUserById = (req, res) => {
      // implementation
    };
  }
}

字符串
您也可以将它们声明为类字段:

export default class UserController {
  constructor(dependencies) {
    this.dependencies = dependencies;
  }
  getAllUsers = (req, res) => {
    // implementation
  };
  findUserById = (req, res) => {
    // implementation
  };
}


这是有some problems,但它们主要与继承有关,我怀疑你想子类化你的控制器(使用组合代替)。
或者,使用function代替class

export default function UserController(dependencies) {
  return {
    getAllUsers(req, res) {
      // implementation
    },
    findUserById(req, res) {
      // implementation
    },
  };
}


在这里,你可以通过闭包引用dependencies,而不是作为this的属性(同样没有绑定)。

bis0qfac

bis0qfac2#

// UserController.js
class UserController {
  //inject services here if needed and you can access them through "this" inside methods implementations
  constructor() {}

  getAllUsers() {
    return async (req, res, next) => {
      try {
        // "this" here refers to the UserController class
        return res.status(200).json({});
      } catch (error) {
        next(error);
      }
    };
  }
}

module.exports = UserController;

字符串
至于路由器处理程序,它会像这样

// UserRouter.js
userRouter.get('/users', userController.getAllUsers());


如果你使用的是 typescript ,你应该这样输入

interface IConfigController {
  get: () => (req: Request, res: Response, next: NextFunction) => Promise<Response | undefined>;
}


所以它基本上是一个函数,它接受任何需要的东西,并返回一个返回promise的处理程序
返回的promise应该返回你的函数返回的任何东西,所以在我的例子中,我返回响应,或者在错误的情况下返回undefined,这就是为什么它是Promise<Response | undefined>类型的原因。

相关问题