【问题标题】:Endpoint returns 404 when using custom Express server使用自定义 Express 服务器时,端点返回 404
【发布时间】:2019-01-10 02:46:14
【问题描述】:

我有一个包含两个页面的 Next.js 应用程序。我的结构如下所示:

/pages
    /index.js
    /city.js

我创建了一个自定义服务器,因此如果用户转到主页以外的任何内容,它应该呈现 city.js。例如,如果您访问 myapp.com/phl,则 url 应该保留 myapp.com/phl,但它应该呈现 city.js。如果您访问 myapp.com/stl,这同样适用。

这是我的自定义服务器:

const express = require('express');
const next = require('next');
const url = require('url');
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handler = app.getRequestHandler();

app.prepare()
    .then(() => {
        const server = express();

        server.get('*', (request, response) => {
            return handler(request, response);
        });

        server.get('/:airportCode', (request, response) => {
            console.log('hello from the server');
            app.render( request, response, '/city', { ...request.query, ...request.params } );
        });

        server.listen(3000, error => {
            if (error) throw error;

            console.log('> Ready on http://localhost:3000');
        });
    })
    .catch(exception => {
        console.error(exception.stack);
        process.exit(1);
    });

当我访问主页时,它会很好地呈现该页面,但是当我转到 https://myapp.com/phl 时,我得到一个 404。我错过了什么吗?

【问题讨论】:

    标签: reactjs url-routing next.js


    【解决方案1】:

    您需要使用星号页面处理程序切换页面处理程序:

    const express = require('express');
    const next = require('next');
    const url = require('url');
    const dev = process.env.NODE_ENV !== 'production';
    const app = next({ dev });
    const handler = app.getRequestHandler();
    
    app.prepare()
        .then(() => {
            const server = express();
    
            server.get('/:airportCode', (request, response) => {
                console.log('hello from the server');
                app.render( request, response, '/city', { ...request.query, ...request.params } );
            });
    
            server.get('*', (request, response) => {
                return handler(request, response);
            });
    
            server.listen(3000, error => {
                if (error) throw error;
    
                console.log('> Ready on http://localhost:3000');
            });
        })
        .catch(exception => {
            console.error(exception.stack);
            process.exit(1);
        });

    星号的功能就像任何路径的后备,前一个功能没有处理。

    【讨论】:

    • 所以星号页面处理程序必须始终排在最后?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2019-12-16
    • 1970-01-01
    • 2020-12-18
    • 2013-04-16
    相关资源
    最近更新 更多