Próbuję utworzyć rejestrację i zalogować się po raz pierwszy z Express i Reaguj za pomocą PostgreSQL. Mój post działa dobrze. Użytkownik można dodać do bazy danych, więc wskoczyłem do duplikatów. Używam funkcji Finduserbyail, aby znaleźć mój e-mail, a następnie, w moich trasach, utwórz użytkownika, jeśli nie istnieje.

Próbowałem wszystkiego i nadal daje mi problemy. Udało mi się to pracować, zwracając zapytanie, bez odpowiedzi, której nie sądzę, ma rację:

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

Chociaż potrzebuję odpowiedzi na radzenie sobie z błędami.

Sposób, w jaki znalazłem bardziej powszechne i jest jak próbuję:

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);
    };
};

A kiedy nazywam to tutaj:

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");
    });
});

Ale błąd jest taki:

Cannot read property 'then' of undefined

Jeśli ktoś może dać mi rękę, bo byłem 2/3 tygodni tylko dla uwierzytelniania. Zostawię moją repo, jeśli ktoś chce się spojrzeć, jest jednak trochę niechlujny. https://github.com/jaitone/crud-in-js

Dziękuję Ci!

0
Mario Garcia 22 marzec 2020, 19:46

1 odpowiedź

Najlepsza odpowiedź

Jeśli używasz pg jako część projektu. następnie:

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

Jest całkowicie legalny i piękny. Biblioteka tworzy obietnicę i zwraca go.

Udało mi się to pracować, zwracając zapytanie

Nie zwraca zapytania, zwraca mechanizm, aby uruchomić zapytanie w opakowaniu obiecującym (do uruchomienia w przyszłości). Więc kiedy to zrobisz .then faktycznie wykonuje i zwróci wynik. ALE

Jeśli chcesz to zrobić ręcznie:

W findUserByEmail nie zwracasz Promise, zamiast tego po prostu kończysz łańcuch żądania, mówiąc res.json (co z kolei oznacza, że powracasz undefined).

Możesz utworzyć Promise wrapper lub użyj util.promisfy do Zrób obietnicę 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);
    };
  });
};

Uwaga, Wysyłanie email zamiast całego req i obiektów res to dobry pomysł.

1
Aritra Chakraborty 22 marzec 2020, 16:58