res. json () отправляет данные в виде res.data, но доступ к _id внутри них не определен - PullRequest
0 голосов
/ 13 апреля 2020

Мне сложно понять, почему вызов res. json в моем приложении отправляет данные (объект заказа), но когда я пытаюсь получить доступ к части этих данных (res.data._id) и сохранить ее в переменной Я получаю это как неопределенное. Я знаю, что этот фрагмент данных существует, так как console.log показывает значение _id объекта заказа, но console.logging этот конкретный фрагмент возвращает неопределенным. Что вызывает такое поведение?

Логы бэкэнда c:

router.post("/new", function(req, res) {
    const productInfo = req.body.productInfo;
    let order = new Order();
    order.product = {
        _id: productInfo.id,
        name: productInfo.name,
        description: productInfo.description,
        price: productInfo.price,
        quantity: productInfo.quantity
    }
    order.status = "Created";
    order.total = productInfo.price * productInfo.quantity;
    order.owner = {
        id: req.body.id,
        username: req.body.username
    }
    order.save().then(order => {
        res.status(200).json(`Order created successfully! Created order details: ${order}`);
    }).catch(err => {
        console.log("Order create error: ", err.message);
    });
});

Логики внешнего интерфейса c:

let orderID = "";
return (
    <PayPalButton
          createOrder={(data, actions) => {
            axios.post("http://localhost:4000/orders/new",
                {productInfo, userID, username}
            ).then((res) => {
                if(res.status === 200) {
                    console.log(res.data);
                    console.log(res.data._id)
                    orderID = res.data._id;
                }
            }).catch((err) => {
                console.log(err);
            });
            return actions.order.create({
              purchase_units: [{
                amount: {
                  currency_code: "USD",
                  value: props.amount
                }
              }]
            })
          }}
     />
)

console.log ответ:

Order created successfully! Created order details: { product:
   { _id: '5e68330c8dcfa56868f1d23a',
     name: 'Birdhouse',
     description: 'A beautiful birdhouse',
     price: 5,
     quantity: 2 },
  owner: { username: 'tgoandrex' },
  createdAt: 2020-04-12T23:04:46.286Z,
  _id: 5e93a16eb1cbc837d80167ef,
  status: 'Created',
  total: 10,
  __v: 0 }
undefined

Ответы [ 2 ]

4 голосов
/ 13 апреля 2020

axios ожидает, что конечная точка вернет объект JSON, но вы отправляете клиенту строку:

res.status(200).json(`Order created successfully! Created order details: ${order}`);

Попытка доступа к res.data на клиенте даст вам строковый литерал

"Order created successfully! Created order details: [elided]"

Но так как это строка, свойство _id не существует в ней, и поэтому оно вернет undefined.

Для того, чтобы это работа, вам нужно отправить просто объект, а не строку:

res.status(200).json(order);
2 голосов
/ 13 апреля 2020

Ваша конечная точка /orders/new отвечает не JSON, а простой строкой. Express Метод Response#json ожидает объект, который будет сериализован в JSON, а не в строку.

Вы должны просто передать свой заказ в качестве единственного аргумента методу json:

res.status(200).json(order);

в противном случае ваше приложение React не сможет выполнить синтаксический анализ JSON, так как это недопустимый формат JSON.

...