Node.js 在类方法中访问时,变量变为未定义

Node.js 在类方法中访问时,变量变为未定义,node.js,express,undefined,babel-node,Node.js,Express,Undefined,Babel Node,我在构造函数中定义了一个类变量,该构造函数保存对导入的类实例的引用 然而,当我试图访问类方法中的变量时,我总是得到该变量的undefined 导出类 import models from '../../database/models' const {User} = models; class UserRepository { constructor(){ this.model = User; } async create({firstname, lastname, ema

我在构造函数中定义了一个类变量,该构造函数保存对导入的类实例的引用

然而,当我试图访问类方法中的变量时,我总是得到该变量的
undefined

导出类

import models from '../../database/models'

const {User} = models;

class UserRepository {
  constructor(){
    this.model = User;
  }

 async create({firstname, lastname, email, isadmin, password}){
  return await this.model.create({firstname, lastname, email, isadmin, password})
  }
}

export default new UserRepository();
import repository from './repository';
import { sendSuccessMessage } from '../../utils'

class UserController {
  constructor() {
    this.model = repository;
  }

  async createUser({ body }, res, next) {
    try {
      const result = await this.model.create(body);
      sendSuccessMessage(res, 200, result);
    } catch( e ){
      next(e)
    }
  }
}

export default new UserController();
使用导出的类初始化

import models from '../../database/models'

const {User} = models;

class UserRepository {
  constructor(){
    this.model = User;
  }

 async create({firstname, lastname, email, isadmin, password}){
  return await this.model.create({firstname, lastname, email, isadmin, password})
  }
}

export default new UserRepository();
import repository from './repository';
import { sendSuccessMessage } from '../../utils'

class UserController {
  constructor() {
    this.model = repository;
  }

  async createUser({ body }, res, next) {
    try {
      const result = await this.model.create(body);
      sendSuccessMessage(res, 200, result);
    } catch( e ){
      next(e)
    }
  }
}

export default new UserController();
但是,使用
createUser
中的变量
repository
目录,如下所述:

const result=wait repository.create(body)

一切正常

当前呼叫链

// routes.js file
import controller from './controller'

export default [
  {
    path: '/signup',
    method: 'post',
    handlers: [controller.createUser] // createUser from class UserController
  }
]


// utitlity.js file
export const routesLoader = (routes, router) => {
 for (const route of routes) {
   const { path, handlers, method } = route;
   (router)[method](path, handlers);
 }
};

// app.js file
import express from 'express';
import routes from './routes.js';
import { routesLoader } from './utils';

const router = express.Router();

routesLoader(routes, router);

// server.js file
import http from 'http';
import app from './app';

const { PORT = 3000 } = process.env;

const server = http.createServer(app);

server.listen(PORT, () => {
  console.log(`server listening on localhost: ${PORT}`);
});
错误

TypeError: Cannot read property 'create' of undefined
at _callee$ (C:\Users\MYPC\Downloads\moch-shop-api-master\components\user/controller.js:16:39)
at tryCatch (C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\regenerator-runtime\runtime.js:45:40)
at Generator.invoke [as _invoke] (C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\regenerator-runtime\runtime.js:271:22)
at Generator.prototype.<computed> [as next] (C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\regenerator-runtime\runtime.js:97:21)
at asyncGeneratorStep (C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\@babel\runtime\helpers\asyncToGenerator.js:3:24)
at _next (C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\@babel\runtime\helpers\asyncToGenerator.js:25:9)
at C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\@babel\runtime\helpers\asyncToGenerator.js:32:7
at new Promise (<anonymous>)
at C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\@babel\runtime\helpers\asyncToGenerator.js:21:12
at createUser (C:\Users\MYPC\Downloads\moch-shop-api-master\components\user\controller.js:70:28)
at Layer.handle [as handle_request] (C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\express\lib\router\layer.js:95:5)
at C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\express\lib\router\index.js:281:22
at Function.process_params (C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\express\lib\router\index.js:335:12)
at next (C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\express\lib\router\index.js:275:10)
at cors (C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\cors\lib\index.js:188:7)
at C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\cors\lib\index.js:224:17
at originCallback (C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\cors\lib\index.js:214:15)
at C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\cors\lib\index.js:219:13
at optionsCallback (C:\Users\MYPC\Downloads\moch-shop-api-master\node_modules\cors\lib\index.js:199:9)

您的方法create是一个实例方法。它需要是静态的,才能正常工作。首先,您需要在使用它之前正确导入
UserRepository

import UserRepository from 'path to UserRepository class';
然后 在函数中使用
self
,如下所示:

async createUser({ body }, res, next) {
 const self = this;
 try {
   const result = await self.model.create(body);
   sendSuccessMessage(res, 200, result);
 } catch( e ){
   next(e)
 }
}

我认为在createUser()函数中使用
self
比使用
this
更好。

如何调用
UserController.createUser
?听起来好像它的
这个
设置不正确。假设我们初始化了类,如下所示:

const userController = new UserController();
然后,如果您只传递对该方法的精确引用,则缺少
的一个来源可能是

setImmediate(userController.createUser);
而不是保留此
的方式:

setImmediate(() => {
   userController.createUser()
});

换言之,您希望使用点表示法为该方法创建发票,并涉及类实例。

构造函数是如何在此行中获取UserRepository的。model=UserRepository;Is
this.model=UserRepository
实际上是将类而不是实例分配给
this.model
?@VLAZ我认为它是在分配类的实例,因为导出的是实例,而不仅仅是类名。在这种情况下,它是如何导入的?@VLAZ,我刚刚注意到我输入了一个错误。我刚刚更新了这个问题。但是为什么上下文丢失了?@VLAZ,看到这个答案,我的脑海中出现了同样的问题,是不是
babel节点
传输的代码是原因?@Deep Kakkar,我仍然有同样的问题,
模型
仍然是
未定义的
@wokorodueysamuel?奇怪的是,它会这样做,但这并不是不可能的-以前在传输方面有过错误。调用堆栈有点奇怪,因为它显然创建了一个异步生成器。也许这是对的,但还是有点奇怪。我会更新这个问题,包括它是如何发生的called@wokorodouyesamuel谢谢,这确实是个问题:用保留
这个
的东西替换这个
处理程序:[controller.createUser]
,比如,我不知道是否可能,但是:
处理程序:[()=>{controller.createUser();}]
感谢您指出,我将更仔细地研究这一点。