• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Odświeżanie odpalonego JSON serwera

Object Storage Arubacloud
0 głosów
273 wizyt
pytanie zadane 29 stycznia 2023 w JavaScript przez Beginner555 Obywatel (1,760 p.)
Cześć,

Mam problem w mojej aplikacji napisanej w React. Zrobiłem panel rejestracji, rejestruję użytkownika to widzę, że poprawnie dodaje go do listy użytkowników w users.json. Problem jest w tym, że nie mogę od razu się na to świeżo stworzone konto użytkownika zalogować. Mogę się zalogować jedynie na użytkowników, którzy byli w pliku users.json przed odpaleniem serwera, w trakcie gdy serwer jest odpalony nowych użytkowników nie mogę się zalogować.

Może jest jakiś sposób, na odświeżanie serwera po każdej rejestracji?

Za wszelkie rady dziękuję! ;)
komentarz 29 stycznia 2023 przez ScriptyChris Mędrzec (190,190 p.)
A jak masz zaimplementowaną rejestracje i logowanie?
komentarz 29 stycznia 2023 przez Beginner555 Obywatel (1,760 p.)
Rejestracje i logowanie mam stworzone jako komponenty oddzielnie w aplikacji react, wartości z rejestracji przesyłam na serwer i tam w pliku server.js pushuje te dane do pliku users.json
komentarz 29 stycznia 2023 przez ScriptyChris Mędrzec (190,190 p.)
Czy możesz pokazać implementację backendu? Bo po samym opisie trudno jest wydedukować, gdzie może leżeć problem. Zgadywałbym, że może nie synchronizujesz danych z pliku JSON z nowo zarejestrowanymi użytkownikami, więc nie są oni widoczni przy logowaniu.
komentarz 29 stycznia 2023 przez Beginner555 Obywatel (1,760 p.)
server.post('/api/auth/register', (req, res) => {
	const { email, password, username } = req.body;
	if (isRegisterAuthenticated({ email })) {
		const status = 401;
		const message = 'Email already exist';
		res.status(status).json({ status, message });
		return;
	}

	fs.readFile('./users.json', (err, data) => {
		if (err) {
			const status = 401;
			const message = err;
			res.status(status).json({ status, message });
			return;
		}
		data = JSON.parse(data.toString());
		const last_item_id = data.users[data.users.length - 1].id;

		data.users.push({
			id: last_item_id + 1,
			email: email,
			password: password,
			username: username,
			favorites: [],
		});
		fs.writeFile('./users.json', JSON.stringify(data), (err, result) => {
			if (err) {
				const status = 401;
				const message = err;
				res.status(status).json({ status, message });
				return;
			}
		});
	});
	// const access_token = createToken({email, password, username});
	res.status(200).json({ status: 'Success' });
});

server.post('/api/auth/login', (req, res) => {
	const { email, password } = req.body;
	const user = isLoginAuthenticated({ email, password }).pop();
	console.log(user);

	if (!user) {
		const status = 401;
		const message = 'Incorrect Email or Password';
		res.status(status).json({ status, message });
		return;
	}
	const access_token = createToken({ email, password });
	res.status(200).json({ access_token, userId: user.id });
});

To jest kod z server.js

komentarz 29 stycznia 2023 przez ScriptyChris Mędrzec (190,190 p.)

Na oko, masz race condition wewnątrz middleware rejestracji: fs.readFile oraz fs.writeFile są asynchroniczne, więc zanim wykonają się przekazane do nich callbacki, to cały middleware odpowiedzialny za rejestrację zdąży odesłać odpowiedź wykonując ostatnią linijkę z res.status( .. ).json( .. ). Nie wiem na ile to wpływa na cały proces - bo te operacje na plikach nie powinny być na tyle wolne, żeby (bez automatyzacji) można było zdążyć wyklikać logowanie nowo zarejestrowanego użytkownika. Jest natomiast ryzyko, że rejestracja odpowie "Success", zanim ten proces faktycznie się skończy. Użyłbym tutaj synchronicznych odpowiedników metod: fs.readFileSync i fs.writeFileSync, albo - jeśli potrzebujesz asynchroniczności - odpowiedników opartych o promise; łatwiej będzie wtedy kontrolować przepływ kodu.

Pokaż też implementację funkcji isLoginAuthenticated - jak ona bierze usera?

komentarz 29 stycznia 2023 przez Beginner555 Obywatel (1,760 p.)
function isLoginAuthenticated({ email, password }) {
	return userdb.users.filter(
		(user) => user.email === email && user.password === password
	);
}

 

komentarz 29 stycznia 2023 przez ScriptyChris Mędrzec (190,190 p.)

Skąd jest brana tablica userdb.users?

komentarz 29 stycznia 2023 przez Beginner555 Obywatel (1,760 p.)
const server = jsonServer.create();
const userdb = JSON.parse(fs.readFileSync('./users.json', 'utf-8'));
komentarz 29 stycznia 2023 przez ScriptyChris Mędrzec (190,190 p.)

Czyli plik users.json odczytujesz tylko raz, podczas startu serwera i nigdzie nie aktualizujesz zmiennej userdb? Jeśli tak, to - jak dedukowałem wcześniej - operujesz na początkowych danych użytkowników. Więc przy logowaniu nie ma dostępu do nowych.

komentarz 29 stycznia 2023 przez Beginner555 Obywatel (1,760 p.)

To za każdym razem powielać to linijkę kodu kiedy wyciągam dane z users.json? Czy jest jakiś lepszy sposób?

const userdb = JSON.parse(fs.readFileSync('./users.json', 'utf-8'));

 

1 odpowiedź

+1 głos
odpowiedź 29 stycznia 2023 przez ScriptyChris Mędrzec (190,190 p.)
 
Najlepsza

Jeśli proces logowania ma mieć dostęp do aktualnych użytkowników, to albo za każdym razem odczytuj plik users.json (tak jak robisz to przy rejestracji; tylko popraw możliwy race condition) albo (tak jak teraz) wczytaj go raz (na starcie serwera), sparsuj i na tym operuj w middleware - żeby zawartość była ciągle aktualna. Zapis do pliku możesz zrobić wtedy, gdy serwer będzie wyłączany (możesz się podpiąć pod exit event - pamiętając, że tam można wykonywać tylko operacje synchroniczne).

Natomiast, w dłuższej perspektywie lepiej skorzystać z bazy danych.

komentarz 29 stycznia 2023 przez Beginner555 Obywatel (1,760 p.)
Bardzo, dziękuję Ci za twoją za Pomoc! :)

Podobne pytania

0 głosów
1 odpowiedź 534 wizyt
pytanie zadane 27 września 2019 w JavaScript przez OzonPo Nowicjusz (120 p.)
0 głosów
1 odpowiedź 609 wizyt
0 głosów
1 odpowiedź 204 wizyt
pytanie zadane 26 sierpnia 2016 w JavaScript przez redstar1 Bywalec (2,200 p.)

92,555 zapytań

141,403 odpowiedzi

319,559 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...