Req.params возвращает undefined (на самом деле возвращает: itemId в виде строки, так что это вроде как undefined) вместо id

Прошло несколько дней, когда я не знаю, что не так с моим кодом, и не мог найти для этого никакого решения.

Я также попытался получить идентификатор с помощью запроса (перемещение контроллеров по маршрутам магазина и, конечно, изменение: с помощью?), А также с помощью 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, дайте мне знать, и я обновлю вопрос. Заранее спасибо.

Вы сказали, что console.info(itemId) возвращает itemId? Возвращает itemId или undefined? А можно и req.params попробовать, пожалуйста, логировать?

Murat Colyaran 06.04.2021 13:06

Привет, спасибо за ответ. он фактически возвращает: itemId в виде строки (а не фактического идентификатора), извините, если это не ясно.

msorr95 06.04.2021 14:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот несколько вещей, которые вам следует сделать -

  1. Удалите ожидание в боковой функции addToCart, его не следует использовать с «then».

  2. Убедитесь, что внутри функции addToCart вы получаете значение itemId.

  3. Изменить конечную точку API -

    http://localhost:8090/auth/add-to-cart/${itemId}

Привет, ты меня спас! Я получил itemId внутри функции с помощью этой строки this.props.itemId и изменил точку API, как вы предложили, и теперь она работает нормально! Большое спасибо!! Если вы скажете мне, как, я приму ваш ответ (я всегда вижу такие комментарии в вопросах, но, честно говоря, я понятия не имею, что означает принятие ответа).

msorr95 06.04.2021 15:16

В компоненте Shop вы передаете аргумент itemId компоненту AddToCart, который поступает через props. Props - это в основном аргументы, передаваемые в реагирующие компоненты. Свойства используются для передачи данных от одного компонента к другому. В функции addToCart нет локальной переменной itemId, так как значение находится в реквизитах. Вот почему для доступа к значению из props мы используем this.props.itemId

Pankaj Tanwar 06.04.2021 15:23

Привет, Панкадж, я хотел сказать, что нашел itemId в функции ПОСЛЕ того, как прочитал ваш комментарий. Если бы не ты, я бы не решил эту задачу. Еще раз спасибо!

msorr95 07.04.2021 13:27

Кроме того, я принял ваш ответ, так как вы были 1-м, и это ответ с наибольшим содержанием

msorr95 07.04.2021 13:31

Я нашел твою проблему

Вы не должны использовать .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 06.04.2021 14:46

@ msorr95 Приятно это слышать. Не стесняйтесь принять мой ответ;)

Murat Colyaran 06.04.2021 17:02

Другие вопросы по теме