提交 17cb1ef9 编写于 作者: J JJ Kasper 提交者: Tim Neutkens

Fix rewriting to API routes not including query (#10223)

上级 e2de7a8e
......@@ -561,7 +561,8 @@ export default class Server {
const handled = await this.handleApiRequest(
req as NextApiRequest,
res as NextApiResponse,
pathname!
pathname!,
query
)
if (handled) {
return { finished: true }
......@@ -633,7 +634,8 @@ export default class Server {
private async handleApiRequest(
req: IncomingMessage,
res: ServerResponse,
pathname: string
pathname: string,
query: ParsedUrlQuery
) {
let page = pathname
let params: Params | boolean = false
......@@ -659,15 +661,17 @@ export default class Server {
const builtPagePath = await this.getPagePath(page)
const pageModule = require(builtPagePath)
query = { ...query, ...params }
if (!this.renderOpts.dev && this._isLikeServerless) {
if (typeof pageModule.default === 'function') {
this.prepareServerlessUrl(req, query)
await pageModule.default(req, res)
return true
}
}
await apiResolver(req, res, params, pageModule, this.onErrorMiddleware)
await apiResolver(req, res, query, pageModule, this.onErrorMiddleware)
return true
}
......@@ -831,6 +835,18 @@ export default class Server {
res.end(payload)
}
private prepareServerlessUrl(req: IncomingMessage, query: ParsedUrlQuery) {
const curUrl = parseUrl(req.url!, true)
req.url = formatUrl({
...curUrl,
search: undefined,
query: {
...curUrl.query,
...query,
},
})
}
private async renderToHTMLWithComponents(
req: IncomingMessage,
res: ServerResponse,
......@@ -854,15 +870,7 @@ export default class Server {
if (!isSSG) {
// handle serverless
if (isLikeServerless) {
const curUrl = parseUrl(req.url!, true)
req.url = formatUrl({
...curUrl,
search: undefined,
query: {
...curUrl.query,
...query,
},
})
this.prepareServerlessUrl(req, query)
return result.Component.renderReqToHTML(req, res)
}
......
......@@ -55,6 +55,18 @@ module.exports = {
source: '/hidden/_next/:path*',
destination: '/_next/:path*',
},
{
source: '/api-hello',
destination: '/api/hello',
},
{
source: '/api-hello-regex/(.*)',
destination: '/api/hello?name=:1',
},
{
source: '/api-hello-param/:name',
destination: '/api/hello?name=:name',
},
]
},
async redirects() {
......
export default async (req, res) => res.json({ query: req.query })
......@@ -260,6 +260,23 @@ const runTests = (isDev = false) => {
expect(res.headers.get('refresh')).toBe(`0;url=/`)
})
it('should handle basic api rewrite successfully', async () => {
const data = await renderViaHTTP(appPort, '/api-hello')
expect(JSON.parse(data)).toEqual({ query: {} })
})
it('should handle api rewrite with un-named param successfully', async () => {
const data = await renderViaHTTP(appPort, '/api-hello-regex/hello/world')
expect(JSON.parse(data)).toEqual({
query: { '1': 'hello/world', name: 'hello/world' },
})
})
it('should handle api rewrite with param successfully', async () => {
const data = await renderViaHTTP(appPort, '/api-hello-param/hello')
expect(JSON.parse(data)).toEqual({ query: { name: 'hello' } })
})
if (!isDev) {
it('should output routes-manifest successfully', async () => {
const manifest = await fs.readJSON(
......@@ -476,6 +493,21 @@ const runTests = (isDev = false) => {
),
source: '/hidden/_next/:path*',
},
{
destination: '/api/hello',
regex: normalizeRegEx('^\\/api-hello$'),
source: '/api-hello',
},
{
destination: '/api/hello?name=:1',
regex: normalizeRegEx('^\\/api-hello-regex(?:\\/(.*))$'),
source: '/api-hello-regex/(.*)',
},
{
destination: '/api/hello?name=:name',
regex: normalizeRegEx('^\\/api-hello-param(?:\\/([^\\/]+?))$'),
source: '/api-hello-param/:name',
},
],
dynamicRoutes: [
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册