【问题标题】:Node js error propagate to the caller节点 js 错误传播给调用者
【发布时间】: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


【解决方案1】:

如何使用 Promise 做到这一点的示例:

export default class User {

  constructor() {
    this.userSchema = new Schema({
      username: String,
      password: String,
    });
    this.usermodel = Mongo.getModel('user', this.userSchema);
  }

  signUp({username, password}) {
    var me = this;
    return new Promise(
      function(resolve,reject) {
        var user = new me.usermodel({username: username,password: password});
        me.usermodel.findOne({username: username}).exec((err, userresult) => {
          if (err) {
            reject(err);
          } else {
            if(userresult) { // one user case so
              reject(new Error(
                "User with me Username already exists !. Please try a new Username."
              ));
            } else { // null case
              resolve(new DbResult({}));
            }
          }
        })    
      }
    )
  }  
}

const user = new User();
user.signUp({username: request.body.username, password: request.body.password})
.then(//success
  function(result){
    //do something with result
    response.status(200).json({'successmessage' : 'Successfully Signed Up'});
  }
)
.then(//fail
  undefined //no success handler
  ,function(err){
    //do something with error
    response.status(400).json({'errormessage': e.message});
  }
);

【讨论】:

    猜你喜欢
    • 2017-01-22
    • 2016-12-13
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 2017-11-21
    相关资源
    最近更新 更多