【问题标题】:express/tsyringe TypeError: Cannot read properties of undefined (reading 'service')express/tsyringe TypeError: 无法读取未定义的属性(读取 \'service\')
【发布时间】:2023-02-03 05:56:06
【问题描述】:

我正在为学校做一个小项目,我是表达和依赖注入的新手。我开始这个小项目只是为了了解它是如何工作的。几个小时以来,我一直试图理解这个错误,但我没有找到任何相关信息。 感谢您的帮助 !

TypeError: Cannot read properties of undefined (reading 'service')
    at controllerMethod (D:\Projects\Typescript\third\dist\app.controller.js:20:14)
    at Layer.handle [as handle_request] (D:\Projects\Typescript\third\node_modules\express\lib\router\layer.js:95:5)
    at next (D:\Projects\Typescript\third\node_modules\express\lib\router\route.js:144:13)
    at Route.dispatch (D:\Projects\Typescript\third\node_modules\express\lib\router\route.js:114:3)
    at Layer.handle [as handle_request] (D:\Projects\Typescript\third\node_modules\express\lib\router\layer.js:95:5)
    at D:\Projects\Typescript\third\node_modules\express\lib\router\index.js:284:15
    at Function.process_params (D:\Projects\Typescript\third\node_modules\express\lib\router\index.js:346:12)
    at next (D:\Projects\Typescript\third\node_modules\express\lib\router\index.js:280:10)
    at Function.handle (D:\Projects\Typescript\third\node_modules\express\lib\router\index.js:175:3)
    at router (D:\Projects\Typescript\third\node_modules\express\lib\router\index.js:47:12) 

这是代码:

//app.ts
import express, { json, urlencoded } from 'express'
import { APPROUTE } from './app.route'

const app = express()

app.use(json())
app.use(urlencoded({ extended: false }))
app.use(APPROUTE)

app.listen(5000, ()=>{
    console.log(`connected on port 5000`)
})


//app.controller.ts
import { Request, Response } from "express";
import { inject, singleton } from "tsyringe";
import { AppService } from "./app.service";

@singleton()
export class AppController{

    constructor(@inject(AppService) private service: AppService){}

    controllerMethod(req: Request, res: Response){
        this.service.methodService()
    }
}


//app.service.ts
import { singleton } from "tsyringe";

@singleton()
export class AppService{

    methodService(){
        console.log('service working')
    }
}


//app.route.ts
import 'reflect-metadata'
import { Router } from "express";
import { container } from "tsyringe";
import { AppController } from "./app.controller";

export const APPROUTE = Router()

const controller: AppController = container.resolve<AppController>(AppController)

APPROUTE.get('/', controller.controllerMethod)
// package.json
{
  "scripts": {
    "start": "nodemon ./dist/app.js"
  },
  "devDependencies": {
    "nodemon": "^2.0.16"
  },
  "dependencies": {
    "@types/express": "^4.17.13",
    "@types/node": "^18.0.0",
    "dotenv": "^16.0.1",
    "express": "^4.18.1",
    "reflect-metadata": "^0.1.13",
    "tsyringe": "^4.7.0"
  }
}
//tsconfig.json
{
  "compilerOptions": {
    "target": "es6",                                 
    "experimentalDecorators": true,                  
    "emitDecoratorMetadata": true,
    "module": "commonjs",                                
    "rootDir": "./src",                                  
    "outDir": "./dist",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "strictPropertyInitialization": false,
    "skipLibCheck": true
  }
}

【问题讨论】:

    标签: javascript node.js typescript express tsyringe


    【解决方案1】:

    只需将 APPROUTE.get('/', controller.controllerMethod) 更改为 APPROUTE.get('/', (req, res)=&gt;controller.controllerMethod(req, res))

    【讨论】:

    • 谢谢你的回答,是的,现在可以了。但我不明白为什么它不适用于APPROUTE.get('/', controller.controllerMethod)。有任何想法吗 ?
    • 这是由于 this 在 JavaScript/typescript 中的特殊行为
    【解决方案2】:

    你在 JS 中一如既往地失去了this 请尝试绑定

    从:

     identityRouter
      .route('/login')
      .post(
        identityController.login
      );
    

    到:

     const identityController = container.resolve(IdentityController);
    
     identityRouter
      .route('/login')
      .post(
        identityController.login.bind(identityController)
      );
    

    这里将确保以正确的方式注入/保持 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-31
      • 2013-01-19
      • 2020-05-20
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2021-11-24
      相关资源
      最近更新 更多