-
Notifications
You must be signed in to change notification settings - Fork 2
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, {}>'.
그럼user
에 IUserModel
을 붙여보자
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 };