如何配合getServerSideProps函数正确使用nextjs中间件函数?

63lcw9qa  于 2022-11-29  发布在  其他
关注(0)|答案(1)|浏览(119)

我正在尝试使用nextjs中间件函数,这里我创建中间件文件并添加以下代码

import type { NextRequest } from 'next/server'
import { NextResponse } from 'next/server'

export function middleware(req: NextRequest) {
    const { nextUrl: url, geo } = req

    const country = geo?.country || 'US'

    url.searchParams.set('country', country)

    return NextResponse.rewrite(url)
}

export const config = {
    matcher: '/'
}

在索引页中-

export default function Home(props: any) {
  console.log(props)
  return (
    <h1 className={styles.title}>
      Welcome to {props.country}
    </h1>
  )
}

export const getServerSideProps = ({ query }: any) => ({
  props: query,
})

这里我显示国家名称从props.countryh1标签。它工作得很完美。
但是在geo对象中,中间件提供了-
城市、地区、纬度、经度、国家/地区
在中间件函数中,我想发送完整的geo对象,并从页面组件接收,以显示所有这些地理信息。我该怎么做呢?
我正设法由这发

import type { NextRequest } from 'next/server'
import { NextResponse } from 'next/server'

export function middleware(req: NextRequest) {
    const { nextUrl: url, geo } = req
    //Here I am try to sent full geo object, not only country as string
    //Please tell me any way to sent object from here to page component.
    url.searchParams.set('country', geo)

    return NextResponse.rewrite(url)
}

export const config = {
    matcher: '/'
}

从页面组件中,我想接收所有字段,如cityregionlatitudelongitudecountry。请帮助我,我希望我能澄清我的问题。

ubbxdtey

ubbxdtey1#

将一个对象作为值传递给url.searchParams.set将不起作用,因为该值将在进程中序列化。
相反,你可以使用JSON.stringify将对象转换为字符串,如下所示:

url.searchParams.set("geo", JSON.stringify(geo));

然后在组件中,使用JSON.parse将其再次转换为对象:

const geo = JSON.parse(props.geo);

相关问题