Как проверить, существует ли страница на пользовательском сервере, используя Next. js - PullRequest
2 голосов
/ 15 января 2020

Использование next@9.1.7 с пользовательским сервером с express. Как я могу узнать в моей server.js, существует ли следующая страница. js до вызова handle(req, res)?

Я пытался с помощью app.router.execute, но он всегда возвращает false. Так что я думаю, что это не так. Я проверил документы Next. js и не нашел решения ... У кого-нибудь есть идея?

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

// ...

server.get('*', async (req, res) => {
  const { url, fixed } = fixUrl(req)

  // pageExists is always false ?...
  const pageExists = await app.router.execute(req, res, req.url) 

  // Fix the url and redirect only if the page exists 
  // (to avoid redirects to 404 pages)
  if (fixed && pageExists) {
    res.redirect(301, url)
    return
  }

  handle(req, res)
})

1 Ответ

0 голосов
/ 15 января 2020

Я наконец решил с помощью:

const glob = require('glob')
const path = require('path')

// ...
const pagesDir = path.resolve(`${__dirname}/../src/pages`)
const pages = glob.sync(`${pagesDir}/**/*.js`)
  .map(p => p
    .replace(pagesDir, '')
    .replace('index.js', '')
    .replace('.js', '')
  )

// ...

server.get('*',(req, res) => {
  const { url, fixed } = fixUrl(req)

  if (fixed && pages.includes(url.split('?')[0])) {
    res.redirect(301, url)
    return
  }

  handle(req, res)
})

Если кто-то знает более элегантное решение, оно будет приветствоваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...