簡體   English   中英

使用其他模塊的函數避免異步回調地獄

[英]Avoiding callback hell with async, using functions from other modules

我有一個用戶模塊,我在其中定義要在代碼中使用的函數。 當我創建密碼時,我想利用這些功能:

用戶模塊:

//insert a local user into the database
User.prototype.insertLocalUser = function (email, password, cb) {

  var sql = "INSERT INTO VCUSER ( VCUSER_EMAIL, VCUSER_PASSWORD ) values ('" + email
    + "','" + password + "')";

  db.get().query(sql, function (err, rows) {
    if (err) return cb(err);

    return cb(err, rows);
  });
};

//generate hash function for password
User.prototype.generateHash = function (password, cb) {

  bcrypt.genSalt(10, function(err, salt) {
    if (err) return cb(err);

    bcrypt.hash(password, salt, null, function(err, hash) {
      return cb(err, hash);
    });
  });
};

Passport.js:

這就是我這樣做的地方,當然這還不錯,但我目前一直在嘗試了解如何使用 async 解決簡單的嵌套回調問題,而且我不想繼續使用更復雜的回調嵌套.

//minor callback hell
      user.findByEmail(email, function (err, rows) {
        if (err) return done(err);

        if (rows.length) { //user must already exist prompt user
          return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
        } else {

          user.generateHash(password, function (err, hash) {
            if (err) return done(err);

            //insert a user with the newly hashed password into the database
            user.insertLocalUser(email, hash, function (err, rows) {
              if (err) return done(err);

              user.VCUSER_USERID = rows.insertId;

              //return the user we are done, they should be serialized and redirected
              return done(null, user);
            });
          });
        }
      });

我正在嘗試做這樣的事情:

//first search to see if the user already exists
  user.findByEmail(email, function (err, rows) {
    if (err) return done(err);

    if (rows.length) { //user must already exist prompt user
      return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
    } else {
      async.series([
        //code avoid callback hell here
        user.generateHash... {

        }

        user.insertLocalUser() {

        }
      ]);
    }
  });

我看過很多例子,但我似乎找不到有人在異步內部調用外部模塊代碼的地方。

感謝@Bergi 的反饋,我將研究承諾。 不管是否有人想要這樣做,這里都是我的解決方案。 我強烈建議查看異步瀑布文檔,這是我發現的一些更好的材料。

async.waterfall([
    //look in database for existing users with email inputed return as results
    function findUser(cb) {
      var sql = "SELECT * FROM VCUSER WHERE VCUSER_EMAIL = '" + email + "'";

      db.get().query(sql, function (err, result) {
        if (err) { cb(err); }

        cb(null, result);
      });
    },
    //check if there were any results, if so prompt, if not continue with user creation
    function generateHash(result, cb) {
      if (result.length) { return done(null); } //TODO determine how this is handled back to UI

      bcrypt.genSalt(10, function(err, salt) {
        if (err) { cb(err); }

        bcrypt.hash(password, salt, null, function(err, hash) {
          cb(null, hash);
        });
      });
    },
    //using recently generated hash create a user
    function insertNewUser(hash, cb) {
      var sql = "INSERT INTO VCUSER ( VCUSER_FIRSTNAME, VCUSER_LASTNAME, VCUSER_EMAIL, VCUSER_PASSWORD ) " +
        "values ('" + req.body.firstName + "','" + req.body.lastName + "','" + email + "','" + hash + "')";

      db.get().query(sql, function (err, rows) {
        if (err) { cb(err); }

        cb(null, rows);
      });
    }
  ], function (err, rows) {
    if (err) { return done(err); }
    else {
      user.VCUSER_USERID = rows.insertId;
      return done(null, user)
    }
  });
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM