Поместите объект с помощью React и node - PullRequest
0 голосов
/ 04 августа 2020

После отображения в ListOrder я хочу иметь возможность изменить два значения моего объекта: 'inProgress' и 'fini sh', это нормально .. Но для обновления в db у меня есть ошибка, возможно, связанная с идентификатором или формат объекта.

помогите пожалуйста огромное спасибо

export const ListOrder = props => {
   const [order, setOrder ] = useState(props.commandes)
   const [ inProgressCheck, setInProgress] = useState(true)
   const [ finishCheck, setFinish] = useState(false)
   const handleCheckboxChangeProgress = (e) => {
      const checkbOne = e.target.checked
      setInProgress ( checkbOne )}
   const handleCheckboxChangeFinish = (e) => {
      const checkbTwo = e.target.checked
      setFinish ( checkbTwo )}

   const valid = async () => {
      setOrder(order => ({...order, status: {
         inProgress: inProgressCheck,
         finish: finishCheck
      }}))
   }
   
   const update = async () => {
      console.log('payload', order) // my Object update
      await apiCallStripe.updateOrderById(order).then(res => {
         window.alert(`Update OK`)
      })
   }

updateOrderById ...

const apiCallStripe = axios.create({
    baseURL: 'http://localhost:4242/api',
})
const updateOrderById = (id, payload) => apiCallStripe.put(`/order/${id}`, payload)
...

router ...

router.put('/order/:id', OrderCtrl.updateOrder)

контроллер ...

updateOrder = async (req, res) => {
    const body = req.body
    console.log('body', body)   // empty

    if (!body) {
        return res.status(400).json({
            success: false,
            error: 'You must provide a body to update',
        })
    }
    Order.findOne({_id: req.params.id}, (err, order) => {
        console.log('order', order)     // Empty
        if (err) {
            return res.status(404).json({
                err,
                message: 'Order not found! !',
            })
        }
        order.client = body.client
        order.items = body.items 
        order.totalCmd = body.totalCmd 
        order.status = body.status
        order
            .save()
            .then(() => {
                return res.status(200).json({
                    success: true,
                    id: order._id,
                    message: 'order updated!',
                })
            })
            .catch(error => {
                return res.status(404).json({
                    error,
                    message: 'order not updated!',
                })
            })
    })
}

и схема ...

const Order = new Schema(
    {
        client: { type: Object, required: false },
        items: { type: Object, required: false },
        totalCmd: { type: Object, required: false },
        status: { type: Object, required: false },
    },
    { timestamps: true },   // Date post
)

erreur ...

console.log : http://localhost:4242/api/order/[object%20Object]
in network : {message: "Cast to ObjectId failed for value "[object Object]" at path "_id" for model "order"",…}
message: "Order not found !"

1 Ответ

0 голосов
/ 04 августа 2020

Я предполагаю, что вы взаимодействуете с MongoDB.

Это потому, что вы предоставляете только один аргумент для updateOrderById, но для этого требуются два аргумента.

Вы передаете свой order объект как id, что означает, что параметр payload не определен:

 await apiCallStripe.updateOrderById(order).then(res => {
   window.alert(`Update OK`)
 })

Вам необходимо изменить это, чтобы оно соответствовало сигнатуре updateOrderById, например:

await apiCallStripe.updateOrderById(<the_order_id>, order) // provide the id
  .then(res => {
    window.alert(`Update OK`)
  })
...