J'essaie de configurer une application next.js, mais j'ai du mal à gérer les itinéraires avec une barre oblique de fin. Ainsi, par exemple, si j'ai une structure de pages comme celle-ci:
pages
- index.js
- blog
- index.js
- [slug].js
puis aller à /
me donne la base index.js
, aller à /blog
Donne moi blog/index.js
, et aller à /blog/my-post
Donne moi blog/[slug].js
- jusqu'ici tout va bien.
Mais aller à /blog/
me donne une erreur 404, et il semble qu'il n'y ait aucun moyen de gérer cela sans remplacer entièrement le routeur next.js - je ne peux même pas rediriger /blog/
à /blog
. Y a-t-il un moyen de contourner cela, ou ai-je besoin d'un routeur personnalisé? Existe-t-il un moyen d'étendre le routeur next.js d'une manière qui me permettra de les gérer, sans le remplacer entièrement?
MISE À JOUR: Si vous utilisez next export
que vous pouvez résoudre le problème en ajoutant exportTrailingSlash
à votre next.config.js
Au moment de la rédaction de ce document, il semble qu'il n'y ait aucun moyen de résoudre ce problème sans définir votre propre serveur personnalisé.
Réponse précédente:
Vous devez créer un nouveau fichier blog.js
ci-dessous:
Avec le server.js suivant
const express = require('express')
const next = require('next')
const PORT = process.env.PORT || 3000;
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
app
.prepare()
.then(() => {
const server = express()
server.get('/blog', (req, res) => {
const actualPage = '/blog'
// const queryParams = { title: req.params.id }
app.render(req, res, '/blog', {})
})
server.get('/blog/:id', (req, res) => {
const actualPage = '/blog/[id]'
const queryParams = { title: req.params.id }
app.render(req, res, actualPage, queryParams)
})
server.get('*', (req, res) => {
return handle(req, res)
})
server.listen(PORT, err => {
if (err) throw err
console.log(`> Ready on http://localhost:${PORT}`)
})
})
.catch(ex => {
console.error(ex.stack)
process.exit(1)
})
node server.js
devrait démarrer votre serveur et vous auriez le mappage dont vous avez besoin.
Remarque, blog/index.js
n'est pas utilisé dans cet exemple.
Vous pouvez l'ajouter à votre fichier _app.js
MyApp.getInitialProps = async ctx => {
const pathAndQueryDivided = ctx.ctx.req.url.split('?');
if (pathAndQueryDivided[0].endsWith('/')) {
const urlWithoutEndingSlash = pathAndQueryDivided[0].replace(/\/*$/gim, '');
ctx.ctx.res.writeHead(301, {
Location: urlWithoutEndingSlash + (pathAndQueryDivided.length > 1 ? `?${pathAndQueryDivided[1]}` : ''),
});
ctx.ctx.res.end();
return {};
}
const initialProps = await App.getInitialProps(ctx);
return {
...initialProps,
};
};
Je n'ai pas de solution à cela. C'est toujours un énorme problème. Cependant, j'ai un hack très horrible que j'ai utilisé pour contourner ce problème dans Next.js 9.x.x
Dans mon /pages/_error.js
J'ai ajouté le code suivant:
FourOhFour.getInitialProps = ({asPath, res}: any): any => {
const supportedPaths = [
'/page1/',
'/page2/',
'/page3/'
];
for (let i = 0, l = supportedPaths.length; i < l; i++) {
const path = supportedPaths[i];
if (asPath === path) {
res.writeHead(301, {Location: path.substring(0, path.length - 1)});
return res.end();
}
}
return {};
};
Cela garantira que toutes les pages données seront redirigées vers le bon chemin.
Cela vous oblige à spécifier manuellement toutes les URL de votre page qui pourraient ne pas fonctionner pour vous - mais au moins c'est quelque chose.