Приложение React/MERN stack выдает ошибки при чтении государственной собственности, но они все еще отображаются?

#javascript #reactjs #mongoose #axios

Вопрос:

Этот проект представляет собой приложение для стека MERN с использованием Мангуста и Axios.

В настоящее время этот код отображает все, что я хочу, но когда я проверяю консоль, я вижу это сообщение об ошибке 6 раз для строк 79 и 97 в разделе сообщения пользователя:

Ошибка типа: Не удается прочитать свойства неопределенного (чтение «creatureId»)

Мой файл App.jsx от клиента:

 import { useEffect, useState } from "react"; import './App.scss'; import Userfront from "@userfront/react"; import { Navigate } from "react-router-dom"; import { getUsers, addUser, updateUser } from './services/userServices'; import { getCreatures } from './services/creatureServices';  // initialize Userfront Userfront.init("rbvqd5nd");  // initialize logout button const LogoutButton = Userfront.build({ toolId: "rodmkm" });  // main app component function App() {  // sets user and userfront id state  const [player, setPlayer] = useState([{ _id: 0, userfrontId: 0, name: "", avatarPath: "", experience: 0, creatureId: 0 }]);  const [userfrontId, setUserfrontId] = useState(0);  // sets player creature state  const [playerCreature, setPlayerCreature] = useState([{ _id: 0, name: "", imgPath: "" }]);   // calls authentication on load  useEffect(() =gt; {  // checks for userfront authentication and redirects user if not authenticated  const checkAuth = () =gt; {  if (!Userfront.accessToken()) {  return (  lt;Navigate  to={{  pathname: "/",  state: { from: window.location },  }}  /gt;  );  }  }  checkAuth();  }, []);   useEffect(() =gt; {  // retrieves user data, generates new user if needed, and updates user state on load  const loadAsyncDataUser = async () =gt; {  try {  const { data } = await getUsers();  setUserfrontId(Userfront.user.userId);  const userData = data.filter(user =gt; user.userfrontId === userfrontId);   try {  if (userfrontId !== userData amp;amp; userfrontId !== 0) {  const newUser = {  userfrontId: userfrontId,  name: Userfront.user.name,  avatarPath: null,  experience: 0,  creatureId: null,  }  await addUser(newUser);  }  } catch (error) {  console.log(error);  }   const newUserData = data.filter(user =gt; user.userfrontId === userfrontId);  setPlayer(newUserData);  } catch (error) {  console.log(error);  }  }  loadAsyncDataUser();  // loads player creature data  const loadAsyncDataPlayer = async () =gt; {  try {  const { data } = await getCreatures();  const playerCreatureData = data.filter(creature =gt; creature._id === player[0].creatureId);  setPlayerCreature(playerCreatureData);  }  catch (error) {  console.log(error);  }  }  loadAsyncDataPlayer();  // generates random creature, updates player creature in database, and then updates player creature state  const checkAsyncDataCreature = async () =gt; {  try {  if (player[0].creatureId === null) {  const { data } = await getCreatures();  const randomCreature = data[Math.floor(Math.random() * data.length)]._id;  updateUser(player[0]._id, { creatureId: randomCreature });  setPlayerCreature(randomCreature);  }  }  catch (error) {  console.log(error);  }  }  checkAsyncDataCreature();  }, [player, userfrontId]);   return (  lt;gt;  {/* nav */}  lt;divgt;  lt;LogoutButton /gt;  lt;/divgt;   {/* user details */}  lt;divgt;  {player.map((user) =gt; (  lt;div  key={user._id}  gt;  {user.name}  lt;/divgt;  ))}  lt;/divgt;   {/* player details */}  lt;divgt;  {playerCreature.map((creature) =gt; (  lt;div  key={creature._id}  gt;  lt;img src={creature.imgPath} alt={creature.name} /gt;  {creature.name}  lt;/divgt;  ))}  lt;/divgt;  lt;/gt;  ); }  export default App;  

Мои схемы с сервера: models/creature.js:

 const mongoose = require("mongoose"); const Schema = mongoose.Schema;  const creatureSchema = new Schema({  name: {  type: String,  required: true,  },  imgPath: {   type: String,  required: true,  } });  module.exports = mongoose.model("creature", creatureSchema);  

models/user.js:

 const mongoose = require("mongoose"); const Schema = mongoose.Schema;  const userSchema = new Schema({  userfrontId: {  type: Number,  },  name: {  type: String,  },  avatarPath: {  type: String,  },  experience: {  type: Number,  },  creatureId: {  type: Schema.Types.ObjectId,  } });  module.exports = mongoose.model("user", userSchema);  

Я пробовал использовать различные методы, такие как функциональный рендеринг, использование констант для косвенного доступа к государственной собственности и т. Д., Но безуспешно.

Ответ №1:

Проверьте , setPlayer вызывается ли, который позже устанавливает player , а затем должен предоставить объект, в player[0] котором есть свойство creatureId , как указано в ошибке. Вы можете проверить это лучше всего с помощью инструментов разработки React в качестве расширения браузера. Я думаю, что игрок не найден или не назначен правильно, и поэтому происходит эта ошибка.

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

1. [ { «имя»: «государство», «значение»: [ { «поля _id»: «61a2c262e89b69cf296c76df», «userfrontId»: 1, «имя»: «Джесси», «avatarPath»: нулевой, «опыт»: 0, «creatureId»: «619fe14576cc938733d9f695», «__V» в: 0 } ], «subHooks»: [], «hookSource»: { «номер_строки»: 93, «имя_функции»: «приложение», «имя_файла»: » localhost:3000/static/js/main.chunk.js «, «номер столбца»: 85 } }

2. Я полагаю, что это значение состояния игрока[0], взятое из среды разработки с использованием рекомендованного вами расширения. (Кстати, мне нравится расширение)

3. Если вам нужна моя помощь, вы должны правильно ответить с описанием и шагами для воспроизведения, а не только с массивом js.

4. Не за что! Извините, новенький здесь и не привык ко всему, что посылается на «enter» lol

5. Вероятно, вам придется проверить свой жизненный цикл на предмет того, как все выполняется. Как мы видим, creatureId определен в состоянии, но вы получаете сообщение об ошибке, что он не определен. Вероятно, код выполняется до того, как состояние задано свойством creatureId.