Зарегистрируйтесь и войдите, Express, React, Node, Psql - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь создать регистрацию и логин в первый раз с express и реагировать с помощью PostgreSQL. Мой пост работает просто отлично. Пользователь может быть добавлен в базу данных, поэтому я приступил к обработке дубликатов. Я использую функцию findUserByEmail, чтобы найти свою электронную почту, а затем, в моих маршрутах, создать пользователя, если он не существует.

Я перепробовал все и до сих пор вызывает проблемы. Мне удается заставить его работать, просто возвращая запрос без ответа, что я не считаю правильным:

const findUserByEmail = (req, response) => {
  return pool.query("SELECT * FROM users WHERE email = $1", [req.body.email])
};

Хотя мне нужен ответ для обработки ошибок.

Способ, который я нашел более распространенным и который я пытаюсь сделать так:

const findUserByEmail = (req, response) => {
  pool.query("SELECT * FROM users WHERE email = $1", [req.body.email]),
    (error, results) => {
      if (error) {
        throw error;
      }
      response.json(results.rows);
    };
};

И когда я звоню здесь:

app.post("/signup/user", (req, res, next) => {
  queries
    .findUserByEmail(req, res)
    .then(user => {
      if (user.rows.length > 0) {
        res.status(400).send("this email is already in use");
      } else {
        queries.createUser(req.body, res);
      }
    })
    .catch(err => {
      console.log(err);
      res.status(500).send("Something went wrong");
    });
});

Но ошибка:

Cannot read property 'then' of undefined

Если кто-нибудь может мне помочь, потому что я провел 2/3 недели только для аутентификации. Я оставлю репо, если кто-нибудь захочет посмотреть, хотя и немного грязно. https://github.com/jaitone/CRUD-in-JS

Спасибо!

1 Ответ

1 голос
/ 22 марта 2020

, если вы используете pg как часть вашего проекта. тогда:

const findUserByEmail = (req, response) => { // send just email instead
  return pool.query("SELECT * FROM users WHERE email = $1", [req.body.email])
};

Это совершенно законно и красиво. Библиотека создает обещание и возвращает его.

Мне удается заставить его работать, просто возвращая запрос

Он не возвращает запрос, он возвращает механизм выполнить запрос в оболочке обещания (будет запущен в будущем). Поэтому, когда вы выполните .then, он будет фактически выполнен и вернет результат. НО

Если вы хотите сделать это вручную:

В findUserByEmail вы не возвращаете Promise, вместо этого вы просто заканчиваете цепочку запросов на говоря res.json (что в свою очередь означает, что вы возвращаете undefined).

Вы можете создать оболочку Promise или использовать util.promisfy, чтобы сделать pool.query обещанием .

const findUserByEmail = (req, response) => { // send just email instead
  return new Promise((resolve, reject)=>{
    pool.query("SELECT * FROM users WHERE email = $1", [req.body.email]),
    (error, results) => {
      if (error) {
        reject(error);
      }
      resolve(results.rows);
    };
  });
};

Заметьте, отправка email вместо целых req и res объектов - хорошая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...