使用 Typescript 在 Mongoose 中链接 ES6 Promise
Chaining ES6 Promises in Mongoose with Typescript
我正在尝试将 ES6 承诺与 Mongoose 4.5.4
联系起来
public static signup(req: express.Request, res: express.Response) {
UserModel.findOne({ email: req.body.email }).exec()
.then(existingUser => {
if(existingUser) {
return res.send({ message: 'Email is in use' });
}
return UserModel.create({
firstName: req.body.firstName,
lastName: req.body.lastName,
email: req.body.email,
password: req.body.password
});
})
.then(user => {
return res.send({ token: AuthUtils.createJWT(user)});
})
.catch(err => {
console.log(err);
});
}
但是,当我尝试 return UserModel.create(...)
:
时,Typescript 抛出以下错误
Argument of type '(existingUser: IUser & _Model<IUser> & EventEmitter) => Response | MongoosePromise<IUser & _Model...' is not assignable to parameter of type '(...args: (IUser & _Model<IUser> & EventEmitter)[]) => void | (IUser & _Model<IUser> & EventEmitt...'.
Type 'Response | MongoosePromise<IUser & _Model<IUser> & EventEmitter>' is not assignable to type 'void | (IUser & _Model<IUser> & EventEmitter) | PromiseLike<IUser & _Model<IUser> & EventEmitter>'.
Type 'Response' is not assignable to type 'void | (IUser & _Model<IUser> & EventEmitter) | PromiseLike<IUser & _Model<IUser> & EventEmitter>'.
Type 'Response' is not assignable to type 'PromiseLike<IUser & _Model<IUser> & EventEmitter>'.
Property 'then' is missing in type 'Response'.
.create()
returns 一个承诺,所以我看不出这会是一个问题。
如有任何帮助,我们将不胜感激。
通过在承诺的响应中使用 existing
标志,向现有用户添加控制流。
示例:
public static signup(req: express.Request, res: express.Response) {
UserModel.findOne({ email: req.body.email }).exec()
.then(existingUser => {
if(existingUser) {
return Promise.resolve({
user: existing,
existing: true
});
}
return UserModel.create({
firstName: req.body.firstName,
lastName: req.body.lastName,
email: req.body.email,
password: req.body.password
}).then((user) => {
return Promise.resolve({
existing: false,
user: user
});
});
})
.then(response => {
if (response.existing) {
return res.send({ message: `Email ${response.user.email} is in use` });
} else return res.send({ token: AuthUtils.createJWT(response.user)});
})
.catch(err => {
console.log(err);
});
}
实际上我最终为 ES6 构建了我的项目,这样我就可以使用 async/await
它让我大大简化了代码。
public static async signup(req: express.Request, res: express.Response) {
try {
let user = await UserModel.findOne({ email: req.body.email }).exec()
if(user) {
throw `Email ${user.email} is in use`;
}
if(environment.debug) console.log(`Creating new user ${req.body.firstName} ${req.body.lastName} with email ${req.body.email}`);
user = await UserModel.create({
firstName: req.body.firstName,
lastName: req.body.lastName,
email: req.body.email,
password: req.body.password
});
return res.send({ token: AuthUtils.createJWT(user)});
} catch(e) {
console.log(e);
res.send({ error: e });
}
}
我正在尝试将 ES6 承诺与 Mongoose 4.5.4
联系起来public static signup(req: express.Request, res: express.Response) {
UserModel.findOne({ email: req.body.email }).exec()
.then(existingUser => {
if(existingUser) {
return res.send({ message: 'Email is in use' });
}
return UserModel.create({
firstName: req.body.firstName,
lastName: req.body.lastName,
email: req.body.email,
password: req.body.password
});
})
.then(user => {
return res.send({ token: AuthUtils.createJWT(user)});
})
.catch(err => {
console.log(err);
});
}
但是,当我尝试 return UserModel.create(...)
:
Argument of type '(existingUser: IUser & _Model<IUser> & EventEmitter) => Response | MongoosePromise<IUser & _Model...' is not assignable to parameter of type '(...args: (IUser & _Model<IUser> & EventEmitter)[]) => void | (IUser & _Model<IUser> & EventEmitt...'.
Type 'Response | MongoosePromise<IUser & _Model<IUser> & EventEmitter>' is not assignable to type 'void | (IUser & _Model<IUser> & EventEmitter) | PromiseLike<IUser & _Model<IUser> & EventEmitter>'.
Type 'Response' is not assignable to type 'void | (IUser & _Model<IUser> & EventEmitter) | PromiseLike<IUser & _Model<IUser> & EventEmitter>'.
Type 'Response' is not assignable to type 'PromiseLike<IUser & _Model<IUser> & EventEmitter>'.
Property 'then' is missing in type 'Response'.
.create()
returns 一个承诺,所以我看不出这会是一个问题。
如有任何帮助,我们将不胜感激。
通过在承诺的响应中使用 existing
标志,向现有用户添加控制流。
示例:
public static signup(req: express.Request, res: express.Response) {
UserModel.findOne({ email: req.body.email }).exec()
.then(existingUser => {
if(existingUser) {
return Promise.resolve({
user: existing,
existing: true
});
}
return UserModel.create({
firstName: req.body.firstName,
lastName: req.body.lastName,
email: req.body.email,
password: req.body.password
}).then((user) => {
return Promise.resolve({
existing: false,
user: user
});
});
})
.then(response => {
if (response.existing) {
return res.send({ message: `Email ${response.user.email} is in use` });
} else return res.send({ token: AuthUtils.createJWT(response.user)});
})
.catch(err => {
console.log(err);
});
}
实际上我最终为 ES6 构建了我的项目,这样我就可以使用 async/await
它让我大大简化了代码。
public static async signup(req: express.Request, res: express.Response) {
try {
let user = await UserModel.findOne({ email: req.body.email }).exec()
if(user) {
throw `Email ${user.email} is in use`;
}
if(environment.debug) console.log(`Creating new user ${req.body.firstName} ${req.body.lastName} with email ${req.body.email}`);
user = await UserModel.create({
firstName: req.body.firstName,
lastName: req.body.lastName,
email: req.body.email,
password: req.body.password
});
return res.send({ token: AuthUtils.createJWT(user)});
} catch(e) {
console.log(e);
res.send({ error: e });
}
}