postgres узла «клиент не определен» и не может прочитать свойство «запрос» неопределенных ошибок

#javascript #node.js #postgresql #node-postgres

#javascript #node.js #postgresql #узел-postgres

Вопрос:

Пожалуйста, будьте любезны, я знаю, что я полуторагодовалый.

Я успешно подключен к своей базе данных. Ура. Однако при попытке входа пользователя я получаю сообщение об ошибке client is not defined

Как вы можете видеть в моем auth-access.js , я пытаюсь определить client (пока он закомментирован), но тогда я получу ошибку Cannot read property 'query' of undefined

Я знаю, что здесь чего-то не хватает, но я схожу с ума, не могу понять это! Любая помощь приветствуется.

Вот мой код.

pg-access.js

 const { Pool } = require("pg");

const localConfig = {
    database: process.env.PG_DATABASE,
    user: process.env.PG_USER,
    port: process.env.PG_PORT,
    password: process.env.PG_PASSWORD,
};

const herokuAddonConfig = {
    connectionString: process.env.DATABASE_URL,
};

const pool = new Pool(
    process.env.NODE_ENV === "production" ? herokuAddonConfig : localConfig
);

connectToDb = async () => {
    // ASYNC CONNECT TO DB

    try {
        await pool.connect();
        console.log("connected to chat_app database");
    } catch (err) {
        console.log("Not connected to DB"   err);
    }
};

module.exports = { connectToDb };
  

auth-access.js

 //const saltRounds = 10;
const pgAccess = require("./pg-access");
require("dotenv").config();
require("../routes/auth-routes");
require("pg");
//const { Client } = require("pg");

// let client = await pgAccess.connectToDb();


loginUser = async (name, password) => {
    try {
        await client.query("BEGIN");
        const results = await client.query(
            `SELECT * FROM users WHERE username = '${name}';`
        );
        const saltedPassword = results.rows[0].password;
        const passwordMatch = await bcrypt.compare(password, saltedPassword);

        if (results.rows[0].is_logged_in == true) {
            return {
                isSuccessful: false,
                errorMessage: "This user is already logged in",
            };
        }

        if (!passwordMatch) {
            return {
                isSuccessful: false,
                errorMessage: "Incorrect password",
            };
        } else {
            await client.query(
                `UPDATE users SET last_active_at = NOW() WHERE username = '${name}'`
            );
            await client.query(
                `UPDATE users SET is_logged_in = true WHERE username = '${name}'`
            );
            await client.query("COMMIT");
        }
        let successfulLogin = {
            isSuccessful: true,
            errorMessage: null,
            user: results.rows[0],
        };
        return successfulLogin;
    } catch (err) {
        console.log(`User not logged in ${err}`);
        return {
            isSuccessful: false,
            errorMessage: "Could not locate this username. Please register.",
        };
    }
};

logOutUser = async name => {
    try {
        await client.query("BEGIN");
        const results = await client.query(
            `SELECT * FROM users WHERE username = '${name}'`
        );
        await client.query(
            `UPDATE users SET is_logged_in = false WHERE username = '${name}'`
        );
        await client.query("COMMIT");
        return results.rows[0];
    } catch (err) {
        console.log(`Could not logout user ${err}`);
        return false;
    }
};

putLogoutUser = async id => {
    try {
        await client.query("BEGIN");
        await client.query(`SELECT * FROM users WHERE id = '${id}'`);
        await client.query(
            `UPDATE users SET is_logged_in = false WHERE id = '${id}'`
        );
        await client.query("COMMIT");
    } catch (err) {
        console.log(`Could not logout user ${err}`);
        return false;
    }
};

module.exports = { loginUser, logOutUser, putLogoutUser };
  

и просто для пинки, вот конкретный маршрут, с которым он пытается взаимодействовать:

auth-routes.js

 const express = require("express");
const router = express.Router();
const pgAccess = require("../database/pg-access");
const authAccess = require("../database/authAccess");
const socketService = require("../services/socket-service");
const io = socketService.getIo();

router.post("/login", async (req, res) => {
    const loginName = req.body.userName;
    const password = req.body.password;
    let userMatch = await authAccess.loginUser(loginName, password);

    if (!userMatch.isSuccessful) {
        res.status(401).json({
            message: userMatch.errorMessage,
        });
    } else {
        userMatch = userMatch.user;

        res.status(201).send({ userMatch });
    }

    io.emit("user_online", JSON.stringify(userMatch));
});

router.post("/logout", async (req, res) => {
    const id = req.body.id;
    let logOutName = req.body.userName;

    const userMatch = await authAccess.logOutUser(logOutName);

    if (!userMatch) {
        res.status(401).json({
            message: "there was an issue logging out",
        });
    } else {
        res.status(201).send({ userMatch });
    }

    io.emit("user_disconnect", JSON.stringify(id));
});

router.put("/logout/:id", async (req, res) => {
    const id = req.params.id;

    await authAccess.putLogoutUser(id);

    io.emit("user_disconnect", JSON.stringify(id));
});

module.exports = router;
  

Комментарии:

1. await не работает вне async функции. Таким образом, вы не сможете дождаться вашего connectToDb, где вы пытаетесь это сделать в своем коде.

2. интересно, и, возможно, мне не нужно ждать соединения, поскольку оно уже подключено? Что насчет запросов? Ожидание там тоже не требуется?

3. Я предполагаю, что ваши запросы являются promises, поэтому вам обязательно нужно их дождаться, если вы хотите получить возвращаемое значение, а не ожидающее обещание. Вероятно, вам нужно будет переосмыслить, как вы обрабатываете подключение к базе данных. Обычно я использую обещание в своем файле записи сервера и подключаюсь к базе данных, затем запускаю сервер.

4. Спасибо за ваши ответы. Я считаю, что я использую promises для подключения к БД в моем pg-access.js файле. Если я чего-то не упустил. Мне кажется, что я не импортирую pg-access файл в свой auth-acess.js . Разве это не то, на чем я должен сосредоточиться? Я немного запутался в этом.