es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El enrutamiento en Node JS devuelve un error 404 en el servidor en vivo, pero no en el sistema de pruebas.

Entonces, soy bastante nuevo en NodeJS y quería probar el enrutamiento con él, sin embargo, me encontré con un problema extraño. No estoy seguro si es mi proveedor de alojamiento que tiene algún problema de configuración en su lado.

Pero aquí está mi escenario: tengo un sitio con una buena cantidad de páginas que se generan desde una base de datos basada en ubicaciones guardadas en la base de datos. Por ejemplo, si hay tres ciudades guardadas en la base de datos, necesitaría:

mydomain.com/BigCity

mydomain.com/OtherBigCity

mydomain.com/SmallCity

Una vez más, estas no pueden ser codificadas directamente.

Entonces, aquí está mi código básico solo para probar las redirecciones:

'use strict';
var path = require('path');
var express = require('express');
var fs = require('fs');
var app = express();

// Diferentes variaciones de cosas que he intentado (incluyendo codificación directa solo para probar)
app.use('/', render);
app.use('//', render);
app.use('/*', render);
app.use('/', render);
app.use('Location2', render);
app.use('/Location1', render);

var server = app.listen(process.env.PORT || 3000, function (r) {
    console.log('listening');
});

function render(req, res) {
    fs.readFile(path.resolve("./index.html"), "utf-8", (err, data) => {
        if (err) {
            console.log(err);
            return res.status(500).send("Se produjo un error");
        }

        return res.send(
            data.replace(
                '<div id="root"></div>',
                `<h1>Test</h1><b>${req.originalUrl}</b><br><b>${req.url}</b>`
            )
        )
    })
}

Entonces, en mi sistema local, funciona perfectamente bien y se genera correctamente como se espera. Sin embargo, cuando lo despliego en mi hosting, solo la URL principal funciona (mydomain.com/), pero no importa lo que escriba después del dominio, obtengo un error 404. Tampoco estoy seguro de cómo diagnosticar adecuadamente el problema.

Según mi conocimiento, todos los elementos en el archivo packages.json están instalados en el servidor (supongo que obtendría un error si no lo estuvieran). La única diferencia es que mi computadora local tiene la versión 16 de NodeJS y mi proveedor de alojamiento tiene la versión 10.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar relacionado con la configuración incorrecta de enrutamiento en el proveedor de alojamiento. Sin embargo, hay algunas cosas que podrían intentarse en el código para asegurarse de que esté configurado correctamente.

    En primer lugar, es importante tener en cuenta que el orden en que se declaran las rutas puede importar. Express intentará hacer coincidir las rutas en el orden en que se definen, por lo que si se declara una ruta de captura general antes que una ruta más específica, hará coincidir primero y causará un comportamiento inesperado.

    Con eso en mente, podría ser una buena idea comenzar con la ruta más específica primero y luego pasar a las rutas de captura general según sea necesario. Pero como las ciudades no se pueden codificar directamente, una solución podría ser definir una ruta parametrizada que pueda coincidir con cualquier nombre de ciudad.

    app.get('/:city', render);
    

    Esta ruta coincidirá con cualquier ruta con un solo parámetro después del dominio (por ejemplo, mi dominio.com/GranCiudad), y pasará el parámetro como una propiedad en el objeto req.params. Esto luego se puede usar para generar contenido dinámicamente según la ciudad.

    A continuación, asegúrese de que el entorno de alojamiento tenga la versión correcta de Node.js instalada. Como se mencionó, hay una diferencia entre la versión local (v16) y la versión de alojamiento (v10), y esto podría causar problemas potenciales si hay diferencias de sintaxis entre las dos versiones. Si es posible, podría ser una buena idea utilizar la misma versión en ambos.

    Finalmente, puede ser útil agregar algún registro al aplicativo para ver qué rutas se están activando cuando se realiza una solicitud. Esto se puede hacer utilizando el middleware morgan.

    var morgan = require('morgan');
    app.use(morgan('dev'));
    

    Esto registrará cada solicitud en la consola, incluyendo la URL y el código de respuesta. Esto puede ser útil para diagnosticar por qué una ruta en particular no se está activando como se esperaba.

    En general, parece que el problema está relacionado más probablemente con el enrutamiento, por lo que verificar que las rutas estén configuradas correctamente y en el orden correcto puede ayudar a solucionar el problema.

Comments are closed.