Nuxtでevent.context.paramsでパラメータを取得してはいけない

event.context.paramsとは


Nuxt 4のevent.context.paramsは、サーバーAPIの動的ルートに含まれるパラメータを取得するためのオブジェクトです。

例えば、次のファイルがあるとします。

server/api/users/[id].ts

このAPIに、

/api/users/123

でアクセスすると、

[id].get.ts
import type { User, ReturnJSONUsers } from '@/interfaces'
import { createUserList } from '@/usersDB'

export default defineEventHandler((event): ReturnJSONUsers => {
  const userList = createUserList()
  const id = parseInt(event.context.params?.id ?? '')
  const user = userList.get(id) as User

  return {
    data: [user],
  }
})

event.context.paramsは概ね次のようになります。

{
id: '123'
}

そのため、

event.context.params.id

で '123' を取得できます。

Nuxt 4ではgetRouterParam()が使える

Nuxt 4では、次のように書くことができます。

[id].get.ts
import type { User, ReturnJSONUsers } from '@/interfaces'
import { createUserList } from '@/usersDB'

export default defineEventHandler((event): ReturnJSONUsers => {
  const userList = createUserList()
  const id = parseInt(getRouterParam(event, 'id') ?? '')
  const user = userList.get(id) as User

  return {
    data: [user],
  }
})

これはパラメータを取得できるNuxtのヘルパーです。

特定のパラメータを1つ取得するなら、getRouterParam()のほうが意図が分かりやすいです。

該当するキーが存在しない場合はundefinedを返し、URLエンコードされている場合にデコードする処理も実行されるので、getRouterParam()だと人によって処理結果が変わることも少なくなります。

パラメータを複数取得したい場合は、getRouterParams()で取得できます。

[id].get.ts
const params = getRouterParams(event)
const userId = parseInt(params.id ?? '')
const user = userList.get(userId) as User

数値変換はNumberではなくparseIntを使用する

返すのは文字列またはundefinedなので、数値に変換する際はNumberではなく、parseIntを使用してください。

Numberだと返り値が空文字のときに0に変換されてしまいます。

const id = ''
console.log(Number(id)) // 0
console.log(parseInt(id)) // NaN