2017-02-20 21 views
2

У меня проблема при использовании паспортной стратегии с использованием локального паспорта с использованием узлов js и mongoose. Иногда (не всегда) отображается следующая ошибка, которой я не мог понять, и я не мог войти в систему. Я использовал угловой JS для клиентской стороны.Ошибка Mongoose schematype.castForQuery. Ошибка аутентификации пользователя

TypeError: schematype.castForQuery is not a function 
at cast (/Users/Harry/Desktop/socketio/node_modules/mongoose/lib/cast.js:229:32) 
at Query.cast (/Users/Harry/Desktop/socketio/node_modules/mongoose/lib/query.js:2753:12) 
at Query.findOne (/Users/Harry/Desktop/socketio/node_modules/mongoose/lib/query.js:1353:10) 
at Function.findOne (/Users/Harry/Desktop/socketio/node_modules/mongoose/lib/model.js:1343:13) 
at Strategy._verify (/Users/Harry/Desktop/socketio/app_api/config/passport.js:17:8) 
at Strategy.authenticate (/Users/Harry/Desktop/socketio/node_modules/passport-local/lib/strategy.js:90:12) 
at attempt (/Users/Harry/Desktop/socketio/node_modules/passport/lib/middleware/authenticate.js:348:16) 
at authenticate (/Users/Harry/Desktop/socketio/node_modules/passport/lib/middleware/authenticate.js:349:7) 
at module.exports.login (/Users/Harry/Desktop/socketio/app_api/controllers/authentication.js:302:4) 
at Layer.handle [as handle_request] (/Users/Harry/Desktop/socketio/node_modules/express/lib/router/layer.js:95:5) 
at next (/Users/Harry/Desktop/socketio/node_modules/express/lib/router/route.js:131:13) 
at Route.dispatch (/Users/Harry/Desktop/socketio/node_modules/express/lib/router/route.js:112:3) 
at Layer.handle [as handle_request] (/Users/Harry/Desktop/socketio/node_modules/express/lib/router/layer.js:95:5) 
at /Users/Harry/Desktop/socketio/node_modules/express/lib/router/index.js:277:22 
at Function.process_params (/Users/Harry/Desktop/socketio/node_modules/express/lib/router/index.js:330:12) 
at next (/Users/Harry/Desktop/socketio/node_modules/express/lib/router/index.js:271:10) 

Вот мой код, который указывающего ошибку в: Я попытался войти, но он говорит, что вышеуказанные ошибки иногда (не всегда) .Я не мог найти ошибки.

module.exports.login = function(req, res) { 
if (!req.body.email || !req.body.password) { 
    sendJSONresponse(res, 400, { 
     "message": "All fields Required." 
    }); 
    return; 
} 

passport.authenticate('local', function(err, user, info) { 
    var token; 
    if (err) { 

     sendJSONresponse(res, 400, err); 
     return; 
    } 
    // console.log('user detail : '+user); 
    if (user && user.verified === true) { 
     token = user.generateJwt(); 
     sendJSONresponse(res, 200, { 
      "token": token 
     }); 

    } else { 
     sendJSONresponse(res, 401, info); 

    } 

})(req, res); // make sure that req, res are available to the passport 

}; 

Вот код паспорта стратегии:

passport.use(new LocalStrategy({ 
    usernameField: 'email' 
}, 
function(username, password, done) { 
    User.findOne({ 
     email: username 
    }, function(err, user) { 
     if (err) { 
      console.log("passport_error : "+err); 
      return done(err); 
     } 
     if (!user) { 
      return done(null, false, { 
       "message": "Incorrect Username." 
      }); 
     } 
     if (!user.validPassword(password)) { 
      return done(null, false, { 
       "message": "Incorrect Password." + password 
      }); 
     } 
     console.log(user); 
     return done(null, user); 

    }); 
} 
)); 
+0

Пожалуйста, добавьте следующую строку ведения журнала. Если выход не является '{}', то это ваша проблема. 'console.log (« Object.prototype: », Object.prototype);' – joeytwiddle

+0

@joeytwiddle Да, я сделал это. Сначала я получил {}. И я смог войти в систему успешно. Но когда я начинаю общаться с кем-то и выходить из системы, я не могу войти. Мой адрес электронной почты доходит до функции внутри моего паспорта (функция (имя пользователя, пароль, сделанный)). Здесь имя пользователя печатается независимо от того, что я даю, но он не подходит к этому и не проверяет базу данных. И на этот раз я получил (Object.prototype: {getKey: [Function]}) вместо {}. Можете ли вы выяснить, что может быть? благодаря –

ответ

1

Я нашел решение на мой вопрос. Теперь это работает. Я использовал следующий код, используя Object.prototype ....

Object.prototype.getKey = function(value) { 
     for (var key in this) { 
      if (this[key] == value) { 
       return key; 
      } 
     } 
     return null; 
    }; 
    var key = usernames.getKey(toUser); 

Он успешно вернул ключ определенного значения (toUser в моем случае). Тем не менее, каждый раз, когда я выйти из системы, она не работает и не войдя обратно. Теперь я удалил весь метод и заменить следующим кодом ...

function findKey(user) { 
     for (var key in usernames) { 
      if (usernames[key] == user) return key; 
     } 
     return false; 
    } 
    var key= findKey(toUser); 

Какой простой способ вернуть ключ значение cetrain в объекте JSON. И теперь, в моем методе findOne mongodb нет проблемы. Все еще не удалось понять причину ошибок, используя метод Object.prototype для возврата ключа. Однако странная ошибка уходит с небольшими изменениями.

Итак, если вы, ребята застряли в одном типе ошибки (Schematype.castForQuery не является функцией), это может быть полезно

Спасибо за ответ, хотя.