#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
. Разве это не то, на чем я должен сосредоточиться? Я немного запутался в этом.