Skip to content

Using koa as server side framework, status 404 occurs when load static files. #677

@livoras

Description

@livoras

I am trying using Koa as server side framework of my project. And I followed the example and got my koa's version below:

server.js:

import Koa from 'koa'
import next from 'next'
import Router from 'koa-router'

const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev: true })
const handle = app.getRequestHandler()

app.prepare().then(() => {
  const server = new Koa
  const router = new Router

  router.get('*', async (ctx) => {
    handle(ctx.req, ctx.res)
    ctx.respond = false
  })

  server.use(router.routes())
  server.listen(3000)
}).catch((e) => {
  console.log(e.stack)
})

But when load static files 'main.js' and 'common.js' in .next, the browser complains that these files are not found with status 404, but the content of the files are actually correct.

image

I read the source code and found that next.js always tried to load gzip version of these files and if not found it would load the normal version.

So it actually run the serveStatic function twice. But the first time it tried to load gzip version but it failed then the res object got 404 statusCode, and the second the status code still retained in res object of koa for some unknown reasons.

Reseting status code in serveStaticWithGzip function fixed this problem:

export async function serveStaticWithGzip (req, res, path) {
  const encoding = accepts(req).encodings(['gzip'])
  if (encoding !== 'gzip') {
    return serveStatic(req, res, path)
  }

  try {
    const gzipPath = `${path}.gz`
    res.setHeader('Content-Encoding', 'gzip')
    await serveStatic(req, res, gzipPath)
  } catch (ex) {
    if (ex.code === 'ENOENT') {
      res.statusCode = 200 // code added
      res.removeHeader('Content-Encoding')
      return serveStatic(req, res, path)
    }
    throw ex
  }
}

I am using koa@2 and next@beta.

(Poor English, feel free to correct.)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions