【发布时间】:2021-04-23 16:29:10
【问题描述】:
我对 TypeScript 还很陌生,最近遇到了一个我无法解决的问题。
我正在使用 Express 创建一个 REST API。我有一个路由器,它调用一个控制器,在控制器内部,我调用一个服务的方法,然后返回响应。
这是我的路由器的外观:
import express from 'express';
import { BidsController } from '../../controllers/bids.controller';
const router = express.Router();
const bidsController = new BidsController();
router.post('/bids', isAuthenticated, checkRoles(['user']), checkIsVerified, bidsController.createBid);
路由器有一些中间件,但它们都没有使用bidsController,所以我相信它们不会导致错误。
这是我的bidsController:
import validator from '../validator';
import { BidsService } from '../services/bids.service';
class BidsController implements IBidsController {
bidsService;
constructor() {
this.bidsService = new BidsService();
}
async createBid(req: Request, res: Response, next: NextFunction): Promise<void> {
const { params, body } = req;
try {
validator.bids.create(params, body);
const { userId } = res.locals.tokenInfo;
const { value } = body;
const response = await this.bidsService.createBid(value, userId);
res.status(201).json(response);
} catch (exception) {
next(exception);
}
}
}
这是服务:
class BidsService implements IBidsService {
public async createBid(value: number, userId: string): Promise<IBid> {
const bid = new Bid({
value,
user: userId,
})
await bid.save();
return bid;
}
}
所以,当我使用 Postman 调用 POST /bids 端点时,我得到了错误:
"TypeError: Cannot read property 'bidsService' of undefined"
你能帮我解决这个问题吗?
【问题讨论】:
-
当传递给你的 router.post() 函数时,bidsController.createBid 没有正确绑定到 bidsController 实例——你实际上只是传递了一个函数的引用。您需要在调用时指定函数内部的 this 应该是什么。将其替换为 bidsController.createBid.bind(bidsController)。
-
这似乎解决了这个问题。有什么办法可以避免使用绑定?
-
@GvidasPranauskas 是:
(...args) => bidsController.createBid(...args)
标签: javascript node.js typescript express