En primer lugar, por favor, no me critiques. Soy principiante y comencé a aprender el servidor y a trabajar en él. Pero casi todo el tiempo encontré regularmente este error. Busco esta pregunta y quiero saber correctamente al respecto. Pero ahora me estoy confundiendo más porque no sé la razón principal por la que se muestra este error. Entonces, por favor ayúdame. Como principiante, son los únicos errores que me frustran mucho.
En la línea de comando encontré este error
SyntaxError: Unexpected token 1 in JSON at position 0 at JSON.parse (<anonymous>) at createStrictSyntaxError (C:\Projects\book-stock-server\node_modules\body-parser\lib\types\json.js:160:10) at parse (C:\Projects\book-stock-server\node_modules\body-parser\lib\types\json.js:83:15) at C:\Projects\book-stock-server\node_modules\body-parser\lib\read.js:128:18 at AsyncResource.runInAsyncScope (node:async_hooks:199:9) at invokeCallback (C:\Projects\book-stock-server\node_modules\raw-body\index.js:231:16) at done (C:\Projects\book-stock-server\node_modules\raw-body\index.js:220:7) at IncomingMessage.onEnd (C:\Projects\book-stock-server\node_modules\raw-body\index.js:280:7) at IncomingMessage.emit (node:events:402:35) at endReadableNT (node:internal/streams/readable:1343:12)
En el lado del cliente, básicamente quiero disminuir la cantidad 1 por 1 haciendo clic en el botón (handleDelivered) y enviar la cantidad como una solicitud al servidor para almacenar la cantidad en la base de datos MongoDB. Pero cuando implemento esta funcionalidad, no funciona y muestra ese error en la línea de comando.
const handleDelivered = () => { const updatedQuantity = { quantity: quantity - 1 }; const url = `http://localhost:5000/books/${id}`; (async () => { try { const res = await fetch(url, { method: "PUT", headers: { 'Content-type': 'application/json' }, body: JSON.stringify(updatedQuantity.quantity) }) const data = await res.json(); if (data.modifiedCount >= 1) { setbookInfo({ ...bookInfo, quantity: updatedQuantity.quantity }); } } catch (err) { console.error(err); toast.error("There was a server side error"); } })(); }
Aquí en el lado del servidor hice exactamente para almacenar la cantidad en la base de datos y enviar la respuesta al cliente
const id = req.params.id; const updatedQuantity = req.body; const filter = { _id: ObjectId(id) }; const option = { upsert: true }; const updatedDoc = { $set: { quantity: updatedQuantity.quantity } }; const result = await bookCollection.updateOne(filter, updatedDoc, option); res.send(result); })
Esto es causado por body-parser
.
En esta línea dice:
if (first !== '{' && first !== '[') {
… pero la especificación JSON se cambió hace años para permitir que el tipo de datos de nivel superior en un texto JSON sea cualquier tipo de datos JSON y no solo una matriz u objeto.
Está enviando un número como su tipo de datos JSON de nivel superior, que está permitido por la especificación JSON actual, pero que hace que body-parser
, en su configuración predeterminada, arroje un error.
Puede cambiar body-parser
para admitir la especificación actual con una opción de configuración :
estricto
Cuando se establece en verdadero, solo aceptará matrices y objetos; cuando sea falso aceptará cualquier cosa que JSON.parse acepte. El valor predeterminado es verdadero.
Alternativamente, una solución alternativa sería enviar un objeto en lugar de un número:
body: JSON.stringify(updatedQuantity)
Debería cambiar el código del lado del servidor para leer req.body.quantity
en lugar de req.body