我應該如何在 Controller 中匯入 loginMember?我正在開發 REST API,現在我需要在不同的檔案位置使用代碼。我在控制器中有錯誤。當我呼叫 loginMember 時。(找不到名稱 'loginMember'.ts(2304))
服務
import MembersModel from '../models/MembersModel';
import BaseService from './BaseService';
import { createPasswordToHash } from '../scripts/utils/auth';
class MembersService extends BaseService {
constructor() {
super(MembersModel);
}
// loginMember
loginMember = async (email: any, password: any) => {
return new Promise(async (resolve, reject) => {
try {
let data = await this.BaseModel.findOne({
email: email,
password: createPasswordToHash(password),
});
return resolve(data);
} catch (error) {
return reject(error);
}
});
};
}
export default MembersService;
控制器
import BaseController from './BaseController';
import MembersService from '../services/MembersService';
import ApiError from '../errors/ApiError';
import { NextFunction, Request, Response } from 'express';
import { createPasswordToHash, generateAccessToken } from '../scripts/utils/auth';
import httpStatus from 'http-status';
class MembersController extends BaseController {
constructor(membersService: MembersService) {
super(membersService);
}
login = (req: Request, res: Response, next: NextFunction) => {
MembersService.loginMember(req.body)
.then((response: any) => {
if (response) {
const member = {
...response.toObject(),
accessToken: generateAccessToken(response.toObject()),
};
delete member.password;
delete member.createdAt;
delete member.updatedAt;
return res.status(httpStatus.OK).send(member);
}
return res.status(httpStatus.UNAUTHORIZED).send({ error: 'Invalid email or password' });
})
.catch((err: { message: string }) => {
return next(
new ApiError(err.message, httpStatus.UNAUTHORIZED, 'login', req.headers['user-agent']?.toString() || 'Unknown')
);
});
};
}
export default new MembersController(new MembersService());
現在我遇到了新錯誤:“型別'typeof MembersService'.ts(2339)上不存在屬性'loginMember'”
uj5u.com熱心網友回復:
您試圖loginMember作為靜態方法呼叫,但它沒有被定義為一個。您必須使用的實體MembersService才能使用該方法。由于您MembersController已經使用MembersService實體進行了初始化,因此您可能只想membersService在MembersController. 此外,該loginMember方法需要電子郵件和密碼,因此您必須顯式傳遞這些引數,而不僅僅是傳遞請求正文。(雖然我不確定電子郵件和密碼在請求正文中的位置,所以我無法幫助您。)因此,通過這些更改,它看起來像:
class MembersController extends BaseController {
private membersService: MembersService;
constructor(membersService: MembersService) {
super(membersService);
this.membersService = membersService;
}
login = (req: Request, res: Response, next: NextFunction) => {
this.membersService.loginMember(email, password) // <- Get these from the request
.then((response: any) => {
if (response) {
const member = {
...response.toObject(),
accessToken: generateAccessToken(response.toObject()),
};
delete member.password;
delete member.createdAt;
delete member.updatedAt;
return res.status(httpStatus.OK).send(member);
}
return res.status(httpStatus.UNAUTHORIZED).send({ error: 'Invalid email or password' });
})
.catch((err: { message: string }) => {
return next(
new ApiError(err.message, httpStatus.UNAUTHORIZED, 'login', req.headers['user-agent']?.toString() || 'Unknown')
);
});
};
另一種代碼風格建議是使用async await而不是.then在login方法中。此外,方法中的 Promise 包裝loginMember看起來沒有必要,并且使用 async 函式作為引數是一種反模式。在避免這些陷阱的同時,以下內容應該可以完成作業:
loginMember = (email: any, password: any): Promise<Response> => {
return this.BaseModel.findOne({
email: email,
password: createPasswordToHash(password),
});
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/455640.html
下一篇:在JavaRestAssured框架中,有沒有辦法使用POJO類來使用x-www-form-urlencoded表單引數?
