6c5efd7b09
cacheable-response.get expects a get(req, res) method signature: https://www.npmjs.com/package/cacheable-response#get Before the change: ``` curl -s -v http://localhost:3000/blog/first 2>&1 | grep HTTP/1.1 > GET /blog/first HTTP/1.1 < HTTP/1.1 404 Not Found ``` After the change: ``` curl -s -v http://localhost:3000/blog/first 2>&1 | grep HTTP/1.1 > GET /blog/first HTTP/1.1 < HTTP/1.1 200 OK ``` This is a partial fix of https://github.com/zeit/next.js/issues/12019 to make the example work. However it doesn't fix the error ``` (node:62360) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client ``` , which will need a change at server/next-server.ts See related issue: https://github.com/zeit/next.js/discussions/11525 https://github.com/zeit/next.js/issues/11665
46 lines
1.1 KiB
JavaScript
46 lines
1.1 KiB
JavaScript
const cacheableResponse = require('cacheable-response')
|
|
const express = require('express')
|
|
const next = require('next')
|
|
|
|
const port = parseInt(process.env.PORT, 10) || 3000
|
|
const dev = process.env.NODE_ENV !== 'production'
|
|
const app = next({ dev })
|
|
|
|
const handle = app.getRequestHandler()
|
|
|
|
const ssrCache = cacheableResponse({
|
|
ttl: 1000 * 60 * 60, // 1hour
|
|
get: async ({ req, res }) => {
|
|
const data = await app.renderToHTML(req, res, req.path, {
|
|
...req.query,
|
|
...req.params,
|
|
})
|
|
|
|
// Add here custom logic for when you do not want to cache the page, for
|
|
// example when the page returns a 404 status code:
|
|
if (res.statusCode === 404) {
|
|
res.end(data)
|
|
return
|
|
}
|
|
|
|
return { data }
|
|
},
|
|
send: ({ data, res }) => res.send(data),
|
|
})
|
|
|
|
app.prepare().then(() => {
|
|
const server = express()
|
|
|
|
server.get('/', (req, res) => ssrCache({ req, res }))
|
|
|
|
server.get('/blog/:id', (req, res) => {
|
|
return ssrCache({ req, res })
|
|
})
|
|
|
|
server.get('*', (req, res) => handle(req, res))
|
|
|
|
server.listen(port, (err) => {
|
|
if (err) throw err
|
|
console.log(`> Ready on http://localhost:${port}`)
|
|
})
|
|
})
|