Правильное использование обещания ожидают и асинхронной функции - PullRequest
0 голосов
/ 11 июня 2018
router.post("/register", function (req, res) {

    console.log(req.body);

    // generate a salt
    (async function(){


    const salt = await bcrypt.genSalt(10);

    // hash the password along with our new salt
    const hash = await bcrypt.hash(req.body.txtPassword1, salt);
    return hash;
    })().then((data)=>{
        var txtPassword = data;
        let newUser = new userModel({
            userName: req.body.txtUserName,
            email: req.body.txtEmail,
            profilePic: req.body.txtFileUpload,
            password: txtPassword,
            isAdmin: false

        });
        newUser.save((function (err) {
            if (err) {
                console.log("failed to save the new User ! : ", err);

            } else {
                console.log("New user has been added successfully with Id", newUser._id);
            }
        }))

        req.flash('success', 'Registeration Successful');

        console.log("Session value ", req.session);
        console.log("value of txt password => ", txtPassword)
        res.render("blogHome", { title: "Blogs || Home" });
    });


}); 

Я хочу знать, является ли это правильным способом использования await.Мне пришлось прибегнуть к этому способу, потому что, когда я просто пытался использовать

var hash = await bcrypt.hash(req.body.txtPassword1,salt);

, я получал неожиданную ошибку идентификатора, когда я работал с приведенным выше кодом, и когда я гуглил, я обнаружил, что ожидание должно использоваться внутри асинхронноготаким образом, я обернул все это в сторону IIFE и использовал обычную обработку обещаний с помощью .then () Но я чувствую, что по незнанию я усложнил простую вещь.Кто-нибудь может указать самый простой способ сделать это.Причина, по которой я был вынужден использовать обещание, заключалась в том, что из-за асинхронного выполнения оператор сохранения базы данных всегда выполнялся до того, как был вычислен хеш, и это означало бы, что пароль пуст, что, в свою очередь, вызывает проверку схемы для поля пароля

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Это правильно, за исключением того, что вы не обрабатываете ошибки, что вам нужно сделать - иначе, на данный момент, вы получаете ошибку «необработанного отклонения» в консоли, а в некоторых будущих версиях Node.js это 'Я прерву процесс при необоснованных отклонениях.

Но я неосознанно чувствую, что усложнил простую вещь.

:-) Это потому, что вы имеете дело с каким-то обещанием-основанные вещи и некоторые вещи, основанные на более раннем Node-callback.Но вы можете сделать его чище, пообещав вещи обратного вызова старого стиля.

Предположим, вы обновили newUserModel.save, поэтому он вернул обещание вместо того, чтобы иметь обратный вызов в стиле узла.Тогда:

router.post("/register", function (req, res) {
    // generate a salt
    (async function(){
        const salt = await bcrypt.genSalt(10);

        // hash the password along with our new salt
        const txtPassword = await bcrypt.hash(req.body.txtPassword1, salt);
        let newUser = new userModel({
            userName: req.body.txtUserName,
            email: req.body.txtEmail,
            profilePic: req.body.txtFileUpload,
            password: txtPassword,
            isAdmin: false

        });
        await newUser.save(); // *** Assumes a new promise-enabled `save`
        console.log("New user has been added successfully with Id", newUser._id);

        req.flash('success', 'Registeration Successful');

        console.log("Session value ", req.session);
        console.log("value of txt password => ", txtPassword)
        res.render("blogHome", { title: "Blogs || Home" });
    })().catch(err => {
        // handle error
    });
});

Если это Express, вы также можете посмотреть Koa (от тех же людей), который позволяет вам сделать весь post обратный вызов async и правильно обработатьошибки одновременно (с промежуточным ПО).

0 голосов
/ 11 июня 2018

Было бы проще просто передать функцию в router.post async.Вы также можете подождать, чтобы сохранить нового пользователя, прежде чем сообщить, что регистрация прошла успешно:

router.post("/register", async (req, res) => {
  const salt = await bcrypt.genSalt(10);
  // hash the password along with our new salt
  const txtPassword = await bcrypt.hash(req.body.txtPassword1, salt);

  const newUser = new userModel({
    userName: req.body.txtUserName,
    email: req.body.txtEmail,
    profilePic: req.body.txtFileUpload,
    password: txtPassword,
    isAdmin: false
  });

  newUser.save((err) => {
    if (err) return console.log("failed to save the new User ! : ", err);
    console.log("New user has been added successfully with Id", newUser._id);
    req.flash('success', 'Registeration Successful');
    console.log("Session value ", req.session);
    console.log("value of txt password => ", txtPassword)
    res.render("blogHome", {
      title: "Blogs || Home"
    });
  });
};
...