вот весь пароект
https://dropmefiles.com/smOr9 |
выдает ошибку
(in promise) SyntaxError: Unexpected token '<', "<html> <"... is not valid JSON Promise.then (асинхронно) (анонимный) @ App.js:9 commitHookEffectListMount @ react-dom.development.js:23150 commitPassiveMountOnFiber @ react-dom.development.js:24926 commitPassiveMountEffects_complete @ react-dom.development.js:24891 commitPassiveMountEffects_begin @ react-dom.development.js:24878 commitPassiveMountEffects @ react-dom.development.js:24866 flushPassiveEffectsImpl @ react-dom.development.js:27039 flushPassiveEffects @ react-dom.development.js:26984 (анонимный) @ react-dom.development.js:26769 workLoop @ scheduler.development.js:266 flushWork @ scheduler.development.js:239 performWorkUntilDeadline @ scheduler.development.js:533 index.js//сервер const express = require("express"); const PORT = process.env.PORT || 3001; const app = express(); app.get("/api", (req, res) => { res.set('Access-Control-Allow-Origin', 'http://localhost:3000/'); res.json({ message: "Hello from server!" }); }); app.listen(PORT, () => { console.log(`Server listening on ${PORT}`); }); index.js//клиент import React,{createContext, useContext} from 'react'; import ReactDOM from 'react-dom/client'; import App from './App.js'; const Context = createContext(null) const arrayse=[ {'id':1,'description':'description1'}, {'id':2,'description':'description2'}, {'id':3,'description':'description3'}, {'id':4,'description':'description4'}, {'id':5,'description':'description5'}, ] const root = ReactDOM.createRoot(document.getElementById('root')); root.render(<Context.Provider value={{arrayse:arrayse}}> <App arrayse={arrayse}/> </Context.Provider> ); app.js import React from "react"; import Shop from "./pages/Shop"; // client/src/App.js function App({arrayse}) { const [data, setData] = React.useState(null); React.useEffect(() => { fetch('http://localhost:3000/api') .then((res) => res.json()) .then((data) => setData(data.message)); }, []); return ( <div className="App"> <header className="App-header"> <p>{!data ? "Loading..." : data}</p> </header> <Shop arrayse={arrayse}/> </div> ) } export default App; |
->
fetch('http://localhost:3001/api') |
теперь пишет что не может спарсить, что делать
Failed to execute 'fetch' on 'Window': Failed to parse URL from http://localhost:3001`/api at App.js:9:1 at commitHookEffectListMount (react-dom.development.js:23150:1) at commitPassiveMountOnFiber (react-dom.development.js:24926:1) at commitPassiveMountEffects_complete (react-dom.development.js:24891:1) at commitPassiveMountEffects_begin (react-dom.development.js:24878:1) at commitPassiveMountEffects (react-dom.development.js:24866:1) at flushPassiveEffectsImpl (react-dom.development.js:27039:1) at flushPassiveEffects (react-dom.development.js:26984:1) at react-dom.development.js:26769:1 at workLoop (scheduler.development.js:266:1) (анонимный) @ App.js:9 commitHookEffectListMount @ react-dom.development.js:23150 commitPassiveMountOnFiber @ react-dom.development.js:24926 commitPassiveMountEffects_complete @ react-dom.development.js:24891 commitPassiveMountEffects_begin @ react-dom.development.js:24878 commitPassiveMountEffects @ react-dom.development.js:24866 flushPassiveEffectsImpl @ react-dom.development.js:27039 flushPassiveEffects @ react-dom.development.js:26984 (анонимный) @ react-dom.development.js:26769 workLoop @ scheduler.development.js:266 flushWork @ scheduler.development.js:239 performWorkUntilDeadline @ scheduler.development.js:533 |
riaron86, а прочитать что тебе написало и приглядеться?
|
Между localhost и /api есть кавычка но в коде её нет
|
riaron86, космические лучи, вестимо.
В коде её не может не быть, смотри внимательно, сделай полнотекстовый поиск... |
теперь нет ошибок но значение data undfined
App.js import React from "react"; import Shop from "./pages/Shop"; // client/src/App.js function App({arrayse}) { const [data, setData] = React.useState(null); React.useEffect(() => { const res= fetch('http://localhost:3001/api',{mode: 'no-cors'}); setData(res.json); }, []); console.log(data); return ( <div className="App"> <header className="App-header"> <p>{!data ? "Loading..." : data}</p> </header> <Shop arrayse={arrayse}/> </div> ) } export default App; index.php const express = require("express"); const PORT = 3001; const app = express(); app.get("/api", (req, res) => { res.set('Access-Control-Allow-Origin', 'https://localhost:3001',{mode: 'no-cors'}); res.json({ message: "Hello from server!" }); }); app.listen(PORT, () => { console.log(`Server listening on ${PORT}`); }); |
fetch - асинхронная функция. Она возвращает промис
res.json - тоже асинхронная. Я не знаток реакта, но fetch надо вызывать как то так fetch('http://localhost:3001/api',{mode: 'no-cors'}) .then( res => res.json()) .then (data => setData(data) ) |
И {mode: 'no-cors'} убрать. Это не магия которая позволит тебе делать кросдоменные запросы без разрешения. Этот заголовок позволяет отравить кросдоменный запрос, но запрещает получение ответа.
И 'Access-Control-Allow-Origin' должен быть не 'https://localhost:3001'(сервер), а 'https://localhost:3000'(клиент) - url тут означает кому ты разрешаешь, а не кто разрешает(что и так ясно). Ну и проще '*' поставить для разработки и не париться. Всё равно в проде удалять. voraa, у него в предыдущем посте всё нормально было с вызовом, техно-шаманит видать, буковки переставляя в надежде на чудо. |
Часовой пояс GMT +3, время: 08:26. |