Как определить переменную 'users', чтобы они считывали данные из моей таблицы MySQL? - PullRequest
0 голосов
/ 03 апреля 2020

Я создаю систему регистрации входа в систему, используя nodejs и mysql, и я решил использовать паспорт js для аутентификации пользователя. Я также хэшировал пароли, используя bcrypt. До сих пор моя форма регистрации способна принимать входные данные из формы и сохранять их в таблице базы данных.

Поскольку я новичок в Node, я понятия не имею, как изменить код моей конфигурации аутентификации. файл, так что данные могут быть прочитаны из таблицы в базе данных и аутентифицироваться из. Ниже приводится файл конфигурации паспорта:

const LocalStrategy = require('passport-local').Strategy
const bcrypt = require('bcrypt')

function initialize(passport, getUserByEmail, getUserById) {
  const authenticateUser = async (email, password, done) => {
    const user = getUserByEmail(email)
    if (user == null) {
      return done(null, false, { message: 'No user with that email' })
    }

    try {
      if (await bcrypt.compare(password, user.password)) {
        return done(null, user)
      } else {
        return done(null, false, { message: 'Password incorrect' })
      }
    } catch (e) {
      return done(e)
    }
  }

  passport.use(new LocalStrategy({ usernameField: 'email' }, authenticateUser))
  passport.serializeUser((user, done) => done(null, user.id))
  passport.deserializeUser((id, done) => {
    return done(null, getUserById(id))
  })
}

module.exports = initialize

Вот ошибка, которую я получаю при входе с зарегистрированными учетными данными:

[nodemon] restarting due to changes...
[nodemon] starting `node server.js`
Database is connected!
New user is registered! INSERT INTO users (firstname, lastname, email, password) VALUES ('w', 'w', 'w@w', '$2b$10$bRcsJON33dZ/RCWsgNdp..G.dc112XaYYTWWiX3a7/YqnXWXE70Aa')
(node:61627) UnhandledPromiseRejectionWarning: ReferenceError: users is not defined
    at /Users/vaidiklapalikar/Desktop/current project/server.js:30:20
    at Strategy.authenticateUser [as _verify] (/Users/vaidiklapalikar/Desktop/current project/config/passport-config.js:6:18)
    at Strategy.authenticate (/Users/vaidiklapalikar/Desktop/current project/node_modules/passport-local/lib/strategy.js:90:12)
    at attempt (/Users/vaidiklapalikar/Desktop/current project/node_modules/passport/lib/middleware/authenticate.js:366:16)
    at authenticate (/Users/vaidiklapalikar/Desktop/current project/node_modules/passport/lib/middleware/authenticate.js:367:7)
    at Layer.handle [as handle_request] (/Users/vaidiklapalikar/Desktop/current project/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/vaidiklapalikar/Desktop/current project/node_modules/express/lib/router/route.js:137:13)
    at checkNotAuthenticated (/Users/vaidiklapalikar/Desktop/current project/server.js:97:5)
    at Layer.handle [as handle_request] (/Users/vaidiklapalikar/Desktop/current project/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/vaidiklapalikar/Desktop/current project/node_modules/express/lib/router/route.js:137:13)
(node:61627) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:61627) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

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

1 Ответ

0 голосов
/ 03 апреля 2020

С частичным кодом, который вы поместили здесь, я подозреваю, что getUserByEmail возвращает обещание.

Если это так, вам нужно поместить эту часть также в блок try и использовать await перед это вызов.

Попробуйте authenticateUser быть таким,

const authenticateUser = async (email, password, done) => {
    try {
      const user = await getUserByEmail(email);

      if (user == null) {
        return done(null, false, { message: 'No user with that email' })
      }

      if (await bcrypt.compare(password, user.password)) {
        return done(null, user)
      } else {
        return done(null, false, { message: 'Password incorrect' })
      }
    } catch (e) {
      return done(e)
    }
  }

Попробуйте, если это не работает, покажите, как initialize используется в вашем другом файле.

Всего наилучшего!

...