【发布时间】:2017-11-20 22:18:24
【问题描述】:
我有一个带有实例函数的类
//file1.js
export default class User {
constructor() {
this.userSchema = new Schema({
username: String,
password: String,
});
this.usermodel = Mongo.getModel('user', this.userSchema);
}
signUp({username, password}) {
var user = new this.usermodel({username: username,password: password});
this.usermodel.findOne({username: username}).exec((err, userresult) => {
if (err) {
/////////////// **LOCATION 1**: throw error that can be
} else {
if(userresult) { // one user case so
/////**LOCATION 2**: throw new Error("User with this Username already exists !. Please try a new Username.");
} else { // null case
return new DbResult({});
}
}
})
}
}
另一个文件file2,我从中调用file1的signUp。
// 文件2.js
const user = new User();
try {
user.signUp({username: request.body.username, password: request.body.password});
console.log("reached means it is synchronous");
response.status(200).json({'successmessage' : 'Successfully Signed Up'});
} catch (e) {
response.status(400).json({'errormessage': e.message});
}
我只想在位置 1 和 2 的 file1.js 中抛出错误,我想在 file2.js 中捕获它(从它被调用的地方)然后处理它。
有人可以帮助如何做到这一点吗? 我对 nodejs 很陌生。
我了解到我们不能像这样在回调中抛出错误,因为它是一个回调,它只会使代码崩溃。 接下来我也读到了这个,但我认为我没有正确理解它,所以实际上不知道从哪里通过。 如果有人解释它并帮助我以正确的方式解决这个问题,那就太好了。
【问题讨论】:
-
你不应该在实际的回调函数中抛出或返回值,因为没有东西可以消耗它们。如果你想坚持回调,
signUp应该接受回调函数。如果你遇到错误,你会做return callback( err );。同样,为了成功,你会做return callback( null, value );。或者,您可以使用 Promises 和/或 await/async。 I'd suggest you read about the three general approaches and decide which you prefer. -
@vox,那是一篇很棒的文章。现在用promise解决了。非常感谢你的那篇文章。那个真的很有价值。
标签: javascript node.js mongoose