Приветствую, не могу найти в чем проблема получения json через сокеты. Возможно кто то посмотрит не замыленым взглядом.
sockets/app.ts
ui/src/app.tsx
ui/scr/interfaces/Inventory/index.tsx
server/modules/database/inventoryRouters.ts
Таблица в БД существует. При открытии http://localhost:25006/getInventoryData получаю Cannot GET /getInventoryData
sockets/app.ts
JavaScript:
import express from 'express';
import http from 'http';
import fs from 'fs';
import path from 'path';
import { socketsConfig,socketsConfigInventory } from './config';
import { Server as SocketIoServer, Socket } from 'socket.io';
import { getInventoryData } from '../database'; // Подключаем функцию получения данных инвентаря
const app = express();
const server = http.createServer(app);
const io = new SocketIoServer(server);
const mapHTML = fs.readFileSync(path.join(__dirname, '../../socks/index.html'), 'utf8');
const socketIO = fs.readFileSync(path.join(__dirname, '../../socks/socket.io.js'), 'utf8');
const socketIOMap = fs.readFileSync(path.join(__dirname, '../../socks/socket.io.js.map'), 'utf8');
app.get('/', (req, res) => {
res.send(mapHTML);
});
app.get('/socket.io.js', (req, res) => {
res.send(socketIO);
});
app.get('/socket.io.js.map', (req, res) => {
res.send(socketIOMap);
});
io.on('connection', (socket: Socket) => {
console.log('Client connected');
// Обработка запроса данных инвентаря через сокеты
socket.on('getInventoryData', async () => {
try {
const inventoryData = await getInventoryData();
// Отправка данных инвентаря обратно клиенту через сокеты
socket.emit('inventoryData', inventoryData);
} catch (error) {
console.error('Error fetching inventory data:', error);
// Обработка ошибки и отправка сообщения об ошибке клиенту через сокеты
socket.emit('inventoryDataError', 'Internal Server Error');
}
});
});
server.listen(socketsConfig.listenPort);
console.log('[SOCKET]: Socket server is ready');
app.listen(socketsConfigInventory.listenPort);
console.log('[SOCKET]: Socket inventory is ready');
export default server;
ui/src/app.tsx
JavaScript:
import React, { useEffect, useState } from 'react';
import './index.sass';
import rpc from '../../shared/rpc';
import Auth from "./interfaces/Auth";
import Notifications from "./interfaces/Notifications";
import { SOUNDS_LIST } from './utils/audio/list';
import { useAppDispatch } from "./hooks/redux";
import { Howl } from "howler";
import CreateChar from "./interfaces/CreateChar";
import Inventory from './interfaces/Inventory';
// @ts-ignore
window.soundSystem = {
list: {},
banList: [],
}
// @ts-ignore
const playSound = ({ file, volume = 0.1, loop = false }) => {
// @ts-ignore
const { list } = window.soundSystem;
const dir = file.split('/')[0];
const isListHasFile = SOUNDS_LIST.hasOwnProperty(file);
const isFileLooped = loop && list.hasOwnProperty(file);
// @ts-ignore
const isFileBanned = ~window.soundSystem.banList.indexOf(dir);
if (!isListHasFile || isFileLooped || isFileBanned) return;
let sound = new Howl({
// @ts-ignore
src: [SOUNDS_LIST[file]],
autoplay: true,
loop,
volume,
onend: () => {
if(!loop) {
// @ts-ignore
this.unload()
}
},
});
if (!loop) return sound.off();
list[file] = sound;
};
// @ts-ignore
window.soundSystem.playSound = playSound;
const stopSound = (file: string) => {
// @ts-ignore
const { list } = window.soundSystem;
if (!list.hasOwnProperty(file)) return;
list[file].unload();
delete list[file];
};
// @ts-ignore
window.soundSystem.stopSound = stopSound;
// @ts-ignore
Object.keys(SOUNDS_LIST).forEach((file) => window.soundSystem.playSound({ file, volume: 0 }));
const App: React.FC = () => {
const dispatch = useAppDispatch();
const [inventory, setInventory] = useState([]);
const [loading, setLoading] = useState(true);
const [inventoryOpen, setInventoryOpen] = useState(false);
const fetchInventoryData = async () => {
try {
console.log('Fetching inventory data...');
const response = await fetch('http://localhost:25006/getInventoryData', {
method: 'POST', // Обновленный метод
});
if (!response.ok) {
throw new Error('Ошибка загрузки данных инвентаря');
}
const inventoryData = await response.json();
setInventory(inventoryData);
setLoading(false);
} catch (error) {
console.error('Ошибка загрузки данных инвентаря:', error.message);
setLoading(false);
}
};
const handleKeyPress = (event: KeyboardEvent) => {
console.log('Key pressed:', event.key);
if (event.key.toLowerCase() === 'ш') {
setInventoryOpen(true);
fetchInventoryData();
}
};
useEffect(() => {
document.addEventListener('keydown', handleKeyPress);
return () => {
document.removeEventListener('keydown', handleKeyPress);
};
}, []);
rpc.register('executeRpc', (action: any) => {
dispatch(action);
});
return (
<>
<Notifications />
<Auth />
<CreateChar />
{loading ? (
<p>Загрузка данных инвентаря...</p>
) : (
<Inventory inventory={inventory} isOpen={inventoryOpen} />
)}
</>
);
};
export default App;
ui/scr/interfaces/Inventory/index.tsx
JavaScript:
import React, { useState } from 'react';
import './styles.sass';
interface InventoryProps {
inventory: any[];
isOpen: boolean;
}
const Inventory: React.FC<InventoryProps> = ({ inventory, isOpen }) => {
//document.body.innerHTML = `Key pressed: ${isOpen}`;
return (
<div style={{ display: isOpen ? 'block' : 'none' }}>
<div id="inventory">
{inventory.map((item) => (
<div key={item.itemName} className="inventory-slot">
{item.itemName}
</div>
))}
</div>
</div>
);
};
export default Inventory;
server/modules/database/inventoryRouters.ts
JavaScript:
import express, { Request, Response } from 'express';
import { Inventory } from '../database/Models/Inventory';
const inventoryRouter = express.Router();
inventoryRouter.all('/getInventoryData', async (req: Request, res: Response) => {
try {
const inventoryData = await Inventory.findAll();
res.json(inventoryData);
} catch (error) {
console.error('Ошибка при получении данных инвентаря:', error);
res.status(500).json({ error: 'Внутренняя ошибка сервера' });
}
});
Таблица в БД существует. При открытии http://localhost:25006/getInventoryData получаю Cannot GET /getInventoryData
Последнее редактирование модератором: