Регистрация, UnhandledPromiseRejectionWarning, UnhandledPromiseRejectionWarning: QueryResultError: 0, предупреждение об устаревании - PullRequest
0 голосов
/ 03 февраля 2019

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

(node:79941) UnhandledPromiseRejectionWarning: QueryResultError: 0
    at new QueryResultError (/Users/Documents/Login_Reg_app/node_modules/pg-promise/lib/errors/queryResult.js:131:24)
    at Query.ctx.db.client.query (/Users/Documents/Login_Reg_app/node_modules/pg-promise/lib/query.js:209:41)
    at Query.handleReadyForQuery (/Users/Documents/Login_Reg_app/node_modules/pg/lib/query.js:125:10)
    at Connection.<anonymous> (/Users/Documents/Login_Reg_app/node_modules/pg/lib/client.js:192:19)
    at Connection.emit (events.js:180:13)
    at Socket.<anonymous> (/Users/Documents/Login_Reg_app/node_modules/pg/lib/connection.js:125:12)
    at Socket.emit (events.js:180:13)
    at addChunk (_stream_readable.js:274:12)
    at readableAddChunk (_stream_readable.js:261:11)
    at Socket.Readable.push (_stream_readable.js:218:10)
(node:79941) 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(). (rejection id: 2)
(node:79941) [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.
POST /signup - - ms - -

В своем коде я пытаюсь проверить, зарегистрирован ли адрес электронной почты пользователя в моей базе данных.Если это так, я хочу предупредить, что электронная почта используется, в противном случае перейдите к регистрации сайта.Если я закомментирую первый раздел кода, который проверяет, зарегистрирована ли уже электронная почта пользователя, регистрационный код работает просто отлично.И наоборот для кода, который проверяет, есть ли электронная почта пользователя уже в базе данных.Проблема в том, что я пытаюсь заставить их работать вместе как одна функция.Код взрывается; (.

Пожалуйста, смотрите мой код

app.post('/', (req, res, next) => {

  const {
    first_name,
    last_name,
    user_name,
    email,
    password
  } = req.body;

  const created_on = date;

  const saltRounds = 10;

  //If user already exist in PostgreSQL Database

  db.one('SELECT user_id, first_name, last_name, email, user_name, password, created_on FROM users WHERE email = $1', [email])
    .then(user => {
      if (user) {
        return res.json({
            message: 'Email Already Exist' + email,
            user: user
          })
          .catch(error => {
            res.json({
              error: error,
              message: 'Unable to locate Email'
            })
            console.log(error);
          })
      } else {

        bcrypt.hash(password, saltRounds, (err, hash) => {

          //If  user never registered for website then following will execute

          db.none('INSERT INTO users(first_name, last_name, user_name, password, email,created_on) VALUES($1,$2,$3,$4,$5,$6)', [first_name, last_name, user_name, hash, email, created_on])
            .then(users => {
              res.json({
                message: 'User Created on ' + date,
                userInfo: req.body
              })
            })
            .catch(error => {
              res.json({
                error: error,
                message: 'Unable to Create User'
              })
              console.log(error);

            })
        })
      }
    })
})

Я довольно новичок в кодировании.Я работаю над проектами, чтобы улучшить мои навыки.Любая помощь будет принята с благодарностью.Заранее спасибо.

1 Ответ

0 голосов
/ 03 февраля 2019

QueryResultError: 0 означает, что запрос не дал результата, но ожидаемое количество возвращаемых строк не должно быть нулевым.Использование .one требует, чтобы запрос возвращал ровно одну строку.

Таким образом, ваш db.one('SELECT user_id, first_name, last_name, email, user_name, password, created_on FROM users WHERE email = $1', [email]) не возвращает результат для email.

И это UnhandledPromiseRejectionWarning, потому что выне обрабатывайте этот случай.

db.one('SELECT user_id, first_name, last_name, email, user_name, password, created_on FROM users WHERE email = $1', [email])
    .then(user => {
      if (user) {
        // ...
      } else {
        // ...
    } /*, function(err) {} */)
    // or .catch(function(err) {}) is missing here

Но из-за вашей if(user) логика вашей программы ожидает, что этот запрос либо возвратит ровно одну строку, либо ни одной, поэтому вы ищете .oneOrNone(...) вместо .one(...).Итак, ваш окончательный код может выглядеть примерно так:

db.oneOrNone('SELECT user_id, first_name, last_name, email, user_name, password, created_on FROM users WHERE email = $1', [email])
    .then(user => {
      if (user) {
        return res.json({
            message: 'Email Already Exist' + email,
            user: user
          })
      } else {

        bcrypt.hash(password, saltRounds, (err, hash) => {

          //If  user never registered for website then following will execute

          db.none('INSERT INTO users(first_name, last_name, user_name, password, email,created_on) VALUES($1,$2,$3,$4,$5,$6)', [first_name, last_name, user_name, hash, email, created_on])
            .then(users => {
              res.json({
                message: 'User Created on ' + date,
                userInfo: req.body
              })
            })
            .catch(error => {
              res.json({
                error: error,
                message: 'Unable to Create User'
              })
              console.log(error);

            })
        })
      }
    })
    .catch(error => {
      res.json({
        error: error,
        message: 'Unexpected error'
      })
      console.log(error);
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...