Skip to content

Week0_기술공유_몽구스&&TypeScript

SuphremeCH edited this page Dec 2, 2019 · 1 revision

기술공유

findOne 사용법

export interface IUser{
    email: string,
    pwd: string,
}
export interface IUserModel extends IUser, Document{}

findOne 실행하면? 데이터가 나오겠지

const user = await User.findOne( { email: 'eamil' } );
const { _id, email } = user;

다음과같은 에러발생

TSError: ⨯ Unable to compile TypeScript:
services/login.ts:21:22 - error TS2339: Property '_id' does not exist on type 'DocumentQuery<IUserModel | null, IUserModel, {}>'.

그럼userIUserModel을 붙여보자

const user:IUserModel = User.findOne({email: 'email'});
const { _id, email } = user;

역시나 에러가 남

TSError: ⨯ Unable to compile TypeScript:
services/login.ts:19:11 - error TS2740: Type 'DocumentQuery<IUserModel | null, IUserModel, {}>' is missing the following properties from type 'IUserModel': email, pwd, name, thumbnailUrl, and 56 more.

const user:IUserModel = User.findOne({email: inputedEmail});

이런건 잘되던데요?

const result = await User.insertMany(users);
const user = await User.deleteOne({name});

무슨 차이가 있을까?

insertMany, deleteOne, findOne 각 함수의 반환값이 모두 다른걸 확인할 수 있음

insertMany(docs: any[], callback?: ((error: any, docs: IUserModel[]) => void) | undefined): Promise<IUserModel[]>
  
deleteOne(conditions: any, callback?: ((err: any) => void) | undefined): Query<{
    ok?: number | undefined;
    n?: number | undefined;
} & {
    deletedCount?: number | undefined;
}>
  
findOne(conditions?: any, callback?: ((err: any, res: IUserModel | null) => void) | undefined): DocumentQuery<IUserModel | null, IUserModel, {}>

기본적으로 mongoose 에서 조건을 가질 수 있는 모든 Model 함수는 callback 이나 exec 을 통해서 실행될 수 있다.

// callback 사용
User.findOne({ email: 'email' }, function (err, user) {
  ...
});

// exec 사용
User.findOne({ email: 'email' }).exec( (err, user) => {
  ...
})

// await 사용
const result = await User.findOne({email; 'email'});

// 위 과정을 분리한 것
const query = User.findOne({ email: 'email' });
const user = await query;

결국 원하는건 _id, email 을 가져오고 싶은것.

const query = User.findOne({ email: 'email' });
const user = await query;
const payload = { _id, email };

다음과 같은 에러발생

pp.ts:74:13 - error TS2339: Property '_id' does not exist on type 'IUserModel | null'.

	const { _id, email } = user;
               ~~~
app.ts:74:18 - error TS2339: Property 'email' does not exist on type 'IUserModel | null'.

	const { _id, email } = user;

타입이 null 이 붙은 union type으로 되어있기 때문에 null 일 경우를 대비해 에러처리를 해줘야한다.

const user = await User.findOne({ email: 'email' });
if(!user) throw new Error();
const payload = { _id, email };

1. 그라운드 룰

2. 스크럼 hackmd link

3. 변경 내역

4. 스프린트

5. 기술공유

6. 팀 회고록

Clone this wiki locally