'stripe invalid integer NaN REACTJS

I keep getting this error and I'm not sure why. I'm sure I'm following the documentation correctly. Have I missed something here? why can stripe not pick up the value?

https://stripe.com/docs/api/payment_intents/update. https://stripe.com/docs/payments/accept-a-payment

stripe session

    const stripe = require("stripe")(process.env.NEXT_PUBLIC_STRIPE_SECRET_KEY);

console.log(process.env.NEXT_PUBLIC_STRIPE_SECRET_KEY);

export default async (req, res) => {
  //
  const { items} = req.body;
  console.log(items);

  

  const session = await stripe.checkout.sessions.create({
    payment_method_types: ["card"],
    line_items: [
      {
        price_data: {
          currency: 'pln',
          product_data: {
            name: items.name,
          },
          unit_amount: items.price * 100,
        },
        quantity: 1,
      },
    ],
    mode: "payment",

    success_url: "http://localhost:3000/Success",
    cancel_url: "http://localhost:3000/Cancel",
   
  });
  res.status(200).json({ id: session.id });
};

Items - this also appears in the console.

{
    "name": "poznan",
    "description": "hey",
    "price": 9.99
}

checkout session error

[ { name: 'poznan', description: 'hey', price: 9.99 } ]
error - Error: Invalid integer: NaN

stripe log

    parameter_invalid_integer - line_items[0][price_data][unit_amount]
    
    {
  "payment_method_types": {
    "0": "card"
  },
  "line_items": {
    "0": {
      "price_data": {
        "currency": "pln",
        "unit_amount": "NaN"
      },
      "quantity": "1"
    }
  },


Solution 1:[1]

I think your items variable is an array and since you're trying to access the field price on an array items.price * 100 is evaluated as undefined * 100 giving you the NaN value for unit_amount. You either need to access items[0].price instead of items.price or if you’re receiving multiple items why not map your array into line_items like so:

line_items: items.map((item)=> ({
      price_data: {
        currency: 'pln',
        product_data: {
          name: item.name,
        },
        unit_amount: item.price * 100,
      },
      quantity: 1,
    },
})),

Solution 2:[2]

Needed to map through the objects and do an implicit return

export default async (req, res) => {
  //
  const { items} = req.body;
  console.log(items);

 const transformedItems = items.map(item => ({
   description: item.description,
   quantity: 1,
   price_data: {
     currency: 'gbp',
     unit_amount: item.price * 100,
     product_data: {
       name: item.name,

     },
   }
 }));

  const session = await stripe.checkout.sessions.create({
    payment_method_types: ['card'],
    line_items: transformedItems,
    mode: "payment",
    
    success_url: "http://localhost:3000/Success",
    cancel_url: "http://localhost:3000/Cancel",
   
  });
  res.status(200).json({ id: session.id });

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Tarzan
Solution 2 shar27