Next.js Image Component - Metadata - Dimensions

3 replies
Last updated: Mar 11, 2022
hi everyone, recently added
options: { metadata: ["dimensions", "image"] }
to the image type and now i cannot upload new images, some of them stuck forever or just fail (screenshot below) without any console warning, other throw an error
"child "meta" fails because [single value of "meta" fails because ["meta" must be one of [location, exif, image, palette, lqip, blurhash, none]]]"

i can only upload previously uploaded images and don’t understand what is the problem. i really need metadata.dimensions for next.js Image component to pass width and height for responsive image. is there any workaround? thanks!
AI Update

Based on the error message you're seeing, the issue is that "dimensions" and "image" are not valid values for the metadata options array in your image schema.

According to the Sanity image metadata documentation, here's what's happening:

Dimensions are ALWAYS included automatically - you don't need to (and shouldn't) specify them in the metadata array. The dimensions field cannot be disabled and is available by default on all image assets.

The valid values for the metadata array are only:

  • "exif"
  • "location"
  • "lqip"
  • "blurhash"
  • "palette"

To fix your issue, change your schema from:

options: { 
  metadata: ["dimensions", "image"] 
}

To either remove the options entirely (dimensions will still be available):

// dimensions are available by default, no options needed
type: 'image'

Or specify only valid metadata types you want:

options: { 
  metadata: ["blurhash", "lqip", "palette"] 
}

To get dimensions for Next.js Image component, you can extract them from the asset reference ID using this pattern (as shown in this answer):

const pattern = /^image-([a-f\d]+)-(\d+x\d+)-(\w+)$/

const decodeAssetId = (id) => {
  const [, assetId, dimensions, format] = pattern.exec(id)
  const [width, height] = dimensions.split("x").map(v => parseInt(v, 10))
  return { assetId, dimensions: { width, height }, format }
}

// Usage:
const { dimensions } = decodeAssetId(image.asset._ref)
// dimensions.width and dimensions.height are now available

After fixing your schema, you should be able to upload images again without errors!

user L
I use nextjs as well and do not need that. if you use next-sanity-image you can set the image to (intrinsic or even better to responsive) and not define the width and height at all. works 100% for me. and with responsive, you can set the sizes but you do not need the intrinsic size, but the rendered size, so the loaded image fits, as explained here .
user M
thanks, I’ll take a look now
This field must be an array of strings where accepted values are
exif
,
location
,
lqip
,
blurhash
and
palette
.
So you can’t use
dimensions
and
image
like you have there.
You need to update your groq query to get the image and dimensions out, not the schema itself.

Sanity – Build the way you think, not the way your CMS thinks

Sanity is the developer-first content operating system that gives you complete control. Schema-as-code, GROQ queries, and real-time APIs mean no more workarounds or waiting for deployments. Free to start, scale as you grow.

Was this answer helpful?