node.js аутентификация с секвелированием и паспортом - путаница с обещаниями и обратными вызовами - PullRequest
0 голосов
/ 04 мая 2020

Надеюсь, кто-нибудь может помочь мне решить, что, я уверен, является ошибкой ладьи ie.

Я пытаюсь адаптировать приложение аутентификации, изначально основанное на mongodb, для работы с sequelize \ MS SQL. , но завязывая узлы, пытаясь совместить рабочий пример на основе обратного вызова с обещанным подходом seqeulize.

Оба MongoDb \ Sequelize предлагают метод findOne ().

Оригинальный (рабочий) код, ссылающийся на коллекцию MongoDb:

module.exports.getUserByUsername = function(username,callback){
  var query = {username: username};
  User.findOne(query,callback);

}

Обратный вызов в этом случае происходит из отдельного вызывающий модуль и является стандартным паролем проверки для паспорта. js локальная стратегия.

Поскольку метод sequelize findOne () ожидает предложение where, я надеялся, что следующее будет готовым решением :

module.exports.getUserByUsername = function(username,callback){
    var query = {where: {username: username}};
    User.findOne(query,callback);
                                              } 

Это выводит функциональный запрос в console.log, но обратный вызов не запускается, поэтому страница зависает.

Глядя на соответствующие документы API, кажется, что сиквелизируется findOne () основывается исключительно на обещаниях, тогда как MongoDb findOne () возвращает обещание только в том случае, если функция обратного вызова не передается методу findOne (), в противном случае поток передается обратному вызову, когда он предоставляется, как в случае с рабочим примером. ,

Я попробовал следующую адаптацию для работы с обещанием продолжения (и целым рядом его перестановок, вызывающих функцию обратного вызова в предложении .then () et c)., Но все они терпят неудачу с зависшей страницей ::

module.exports.getUserByUsername = function(username,callback){
    var query = {where: {username: username}};
  return  User.findOne(query).then(user => {
                                      console.log(user.get({ plain: true })); 
                                       return user.dataValues;
                                       //callback(user.dataValues)     
                                              }).finally(() => {
                                                                console.log('done!')
                                                                });
                                                                 } 

console.log (user.get ()) выводит правильные данные, показывающие, что запрос к базе данных выполнен правильно, возвращая необходимые пользовательские данные, поэтому я чувствую, что я очень близок к поиску правильный синтаксис для доставки этого обратно к обратному вызову паспорта.

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 04 мая 2020

Добавьте необработанное свойство в true, как это, и вы можете получить объект пользователя

User.findOne({ where : {username:username}, raw: true}).then( user => {
  return user
})
...