async / await, похоже, не работает сброс паспорта для nodejs passwd - PullRequest
0 голосов
/ 18 ноября 2018

По какой-то причине я получаю эту ошибку:

Ошибка: для входа в систему req # требуется функция обратного вызова в IncomingMessage.req.login.req.logIn (/ home / project / node_modules / passport / lib / http /request.js: 47: 44) в файле export.update (/home/project/controllers/authController.js:92:13) в файле process.internalTickCallback (internal / process / next_tick.js: 77: 7)

с этим кодом:

exports.update = async (req, res) => {
  const user = await User.findOne({
  resetPasswordToken: req.params.token,
  resetPasswordExpires: { $gt: Date.now() }
  });

  if (!user) {
    req.flash('error', 'Password reset is invalid or has expired');
    return res.redirect('/login');
  }

  const setPassword = promisify(user.setPassword, user);
  await setPassword(req.body.password);
  user.resetPasswordToken = undefined;
  user.resetPasswordExpires = undefined;
  const updatedUser = await user.save();
  await req.login(updatedUser);
  req.flash('success', 'Your password has been reset! You are now 
logged in!');
  res.redirect('/');
};

Что я делаю не так?Я не могу понять это ..

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Точно так же, как Ekin Konc ответил, вы можете только async/await только функции, которые возвращают Promise.

Вы можете написать промежуточное ПО для псевдонима вашего req.login для обещанной функции.

1009 * например *

loginPromisifier.js

const { promisify } = require('util');

const loginPromisifier = (req,res,next)=>{
  req.login = promisify(req.login);
  next();
}

module.exports = loginPromisifier;

, а затем app.js

const loginPromisifier = require(./loginPromisifier) // your path to it
app.use(loginPromisifier);

Надеюсь, это помогло.

0 голосов
/ 18 ноября 2018

Согласно сообщению об ошибке, req.login(updatedUser); ожидает обратный вызов в качестве второго аргумента.По сути, вы бы сделали что-то вроде этого:

req.login(updatedUser, function(err, data) {
  // handle err and data
});

Однако, поскольку вы хотите await для этой асинхронной операции, вам нужно что-то, что возвращает обещание.По сути, вы можете ожидать любого значения, которое является обещанием (а login не возвращает его.

Вы можете построить обещание вокруг этого вызова следующим образом:

await new Promise(function(res, rej) {
  req.login(updatedUser, function(err, data) {
    if (err) rej(err);
    else res(data);
  });
})

Узел.JS поставляется с вспомогательной функцией с именем promisify , которая поможет создать такое поведение, если вы не хотите делать это каждый раз вручную.

...