#node.js #reactjs #mongoose
#node.js #reactjs #мангуст
Вопрос:
Я пытаюсь установить условную логику, используя идентификатор пользователя, чтобы, если аутентифицированный пользователь является тем же пользователем, который создал это сообщение, не показывайте кнопку «Мне нравится». Это работает, однако, если пользователь не вошел в систему, я получаю эту ошибку cannot read property '_id' of undefined
. По сути, пользователь не определен, потому что ни один пользователь не проходит проверку подлинности при выходе пользователя из системы, так как мне справиться с этим без получения этой ошибки и сбоя приложения? Как я могу устранить эту ошибку, но при этом сохранить эту логику с идентификатором пользователя? Спасибо
Post.js
...
.then((result) => {
const {
user: { _id },
} = isAuthenticated();
let updatedPost = { ...post };
updatedPost.likes.push(id);
setPost(updatedPost);
})
.catch((err) => {
console.log(err);
});
};
const showLikeIcon = () => {
const {user: {_id}} = isAuthenticated()
return (
<span>
{/* if user is not signed in, or user = author of post, don't display like icon */}
{post.author amp;amp; post.author.id === _id || !isAuthenticated() ? (
""
) : (
<img
src={Like}
onClick={() => {
like(id);
}}
alt="Like icon"
/>
)}
</span>
);
};
export default Post;
IsAuthenticated()
export const isAuthenticated = () => {
if (typeof window == 'undefined') {
return false;
}
if (localStorage.getItem('jwt')) {
return JSON.parse(localStorage.getItem('jwt'));
} else {
return false;
}
};
Ответ №1:
Сформируйте свой код, я думаю, когда пользователь вошел в вашу isAuthenticated()
возвращаемую структуру данных, например:
{
...
user: {
_id: id,
...
}
}
Так что вы можете сделать {user: {_id}} = isAuthenticated()
. Но когда пользователь не вошел в систему, он просто возвращает false
so isAuthenticated().user
is undefined
, что вызывает ошибку.
Чтобы исправить это, вы можете изменить свой код на что-то вроде:
const showLikeIcon = () => {
const {user} = isAuthenticated();
return (
<span>
// if no user then it will not call user._id
{(!user || (post.author amp;amp; post.author.id === user._id)) ? (
""
) : (
<img
src={Like}
onClick={() => {
like(id);
}}
alt="Like icon"
/>
)}
</span>
);
};
Ответ №2:
Когда переменная не определена, вы не можете получить ее реквизиты. например, когда user
есть undefined
и не имеет никакого значения, если вы хотите получить user._id
, вы получите эту ошибку: cannot read property '_id' of undefined
Может быть, вам нужно сделать что-то вроде этого:
const isAuthenticatedValue = isAuthenticated();
const user = isAuthenticatedValue?._id;
?
оператор предотвращает ошибку
- Я не знаю, что происходит внутри вашей
isAuthenticated()
функции. Если я знаю, я могу помочь лучше
Пример:
const person;
console.log(person?.name);
это не вызовет никакой ошибки
Комментарии:
1. Спасибо за ваш ответ. Я добавил код в
isAuthenticated()
свой вопрос. Я только что попробовал предоставленный вами код, который устранил ошибку, но логика сейчас вообще не работает.
Ответ №3:
Убедитесь, что npm установил body-parser, затем добавьте
let bodyParser = require('body-parser');
app.use(bodyParser());
в начало вашего кода. Это также предполагает, что вы используете Express.
Это должно решить вашу проблему
Ответ №4:
Я думаю, вы могли бы просто проверить, имеет ли user
объект значение, прежде чем обращаться к _id. Например
if(!user) return;
const { user: { _id }} = isAuthenticated();
Поэтому мы используем защитное предложение для проверки того, что user
определено, перед запуском других частей кода