0

First of all, please don't criticize me. I am beginner and I started to learn the server and working on it. But almost all the time I regularly found this error. I search this question and want's to know properly about it. But now I am becoming more confused because I don't know the major reason of showing this error. So, Please help me. As a beginner, It is the only errors that frustrates me a lot.

In the command Line I found this 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)

In the Client Side, I basically want's to decrease quantity 1 by 1 by clicking (handleDelivered) button and sent the quantity as a request to the server to store the quantity in MongoDB database. But when I implement this functionality it doesn't work and shows that error in the command line.

    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");
            }
        })();
    }

Here in the server side I did exactly to store the quantity in the database and send the response to the client

            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);
        })

1 Answers1

0

This is caused by body-parser.

On this line it says:

      if (first !== '{' && first !== '[') {

… but the JSON specification was changed, years ago, to allow the top level data type in a JSON text to be any kind of JSON data and not just an array or object.

You are sending a number as your top level JSON data type, which is allowed by the current JSON specification, but which causes body-parser, in its default configuration, to throw an error.


You can change body-parser to support the current spec with a configuration option:

strict

When set to true, will only accept arrays and objects; when false will accept anything JSON.parse accepts. Defaults to true.

Alternatively, a work-around would be to send an object instead of a number:

body: JSON.stringify(updatedQuantity)

You would need to change the server side code to read req.body.quantity instead of req.body

Quentin
  • 914,110
  • 126
  • 1,211
  • 1,335