Прошло несколько дней, когда я не знаю, что не так с моим кодом, и не мог найти для этого никакого решения.
Я также попытался получить идентификатор с помощью запроса (перемещение контроллеров по маршрутам магазина и, конечно, изменение: с помощью?), А также с помощью req.body, пытающегося получить ввод с идентификатором, но это не так. Работа.
Я также пробовал POST и PATCH вместо GET, и это не сработало.
вот мой код:
auth.js (контроллер)
exports.addToCart = async (req, res, next) => {
try {
// getting the user id from the session so that we can find this user
const userId = req.session.user._id.toString();
// finding the user
const user = await User.findById(userId);
const itemId = req.params.itemId;
console.info(itemId) // returns exactly :itemId as a string (so it does not return the actual item id)
const item = await Item.findById(itemId);
console.info(item); // returns an error because of course the id is wrong
} catch (err) {
console.info(err);
if (!err.statusCode) {
err.statusCode = 500;
}
}
};
auth.js (маршрут)
router.get('/add-to-cart/:itemId', authController.addToCart);
а затем во внешнем интерфейсе я сначала передаю идентификатор элемента в компонент AddToCart следующим образом:
Компонент магазина, в который я загружаю все товары из базы данных:
<ItemStyle key = {item._id}>
<h1>title</h1>
<p>{item.title}</p>
<img alt = {item.title} src = {item.image}></img>
<h1>description</h1>
<p>{item.description}</p>
<h1>price</h1>
<p>{item.price}</p>
<AddToCart itemId = {item._id} />
</ItemStyle>
Компонент AddToCart:
class AddToCart extends Component {
addToCart = async () => {
await fetch(`http://localhost:8090/auth/add-to-cart/:itemId`, {
method: 'GET',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
credentials: 'include',
})
.then(() => {
/* staying on the same page */
return window.location.replace('/shop');
})
.catch(err => console.info(err));
}
render() {
return(
<form encType = "application/x-www-form-urlencoded">
<input type = "hidden" name = "itemId" value = {this.props.itemId} />
<button onClick = {this.addToCart}>Add To Cart</button>
</form>
)
}
}
если я удалю type = "hidden" из ввода, я действительно смогу увидеть, что этому элементу назначен правильный идентификатор. У кого-нибудь есть решение для этого? Если по каким-то причинам я выступаю против политик stackoverflow, дайте мне знать, и я обновлю вопрос. Заранее спасибо.
Привет, спасибо за ответ. он фактически возвращает: itemId в виде строки (а не фактического идентификатора), извините, если это не ясно.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вот несколько вещей, которые вам следует сделать -
Удалите ожидание в боковой функции addToCart, его не следует использовать с «then».
Убедитесь, что внутри функции addToCart вы получаете значение itemId.
Изменить конечную точку API -
http://localhost:8090/auth/add-to-cart/${itemId}
Привет, ты меня спас! Я получил itemId внутри функции с помощью этой строки this.props.itemId и изменил точку API, как вы предложили, и теперь она работает нормально! Большое спасибо!! Если вы скажете мне, как, я приму ваш ответ (я всегда вижу такие комментарии в вопросах, но, честно говоря, я понятия не имею, что означает принятие ответа).
В компоненте Shop вы передаете аргумент itemId компоненту AddToCart, который поступает через props. Props - это в основном аргументы, передаваемые в реагирующие компоненты. Свойства используются для передачи данных от одного компонента к другому. В функции addToCart нет локальной переменной itemId, так как значение находится в реквизитах. Вот почему для доступа к значению из props мы используем this.props.itemId
Привет, Панкадж, я хотел сказать, что нашел itemId в функции ПОСЛЕ того, как прочитал ваш комментарий. Если бы не ты, я бы не решил эту задачу. Еще раз спасибо!
Кроме того, я принял ваш ответ, так как вы были 1-м, и это ответ с наибольшим содержанием
Я нашел твою проблему
Вы не должны использовать .then() и ждать вместе. Я предлагаю вам использовать только await. Как это:
var response = await fetch(`http://localhost:8090/auth/add-to-cart/${itemId}`, {
method: 'GET',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
credentials: 'include',
});
Кроме того, если вы заметили, я использовал вышеупомянутый ${itemId}. Если вы хотите установить переменную в строке. Вы должны использовать это так.
Большое спасибо, именно так я решил проблему (мне также пришлось найти идентификатор внутри функции addToCart).
@ msorr95 Приятно это слышать. Не стесняйтесь принять мой ответ;)
Вы сказали, что
console.info(itemId)возвращаетitemId? ВозвращаетitemIdилиundefined? А можно иreq.paramsпопробовать, пожалуйста, логировать?