Node.js - Rutas sin index con NodeJS

 
Vista:
Imágen de perfil de Kathyu
Val: 32
Ha aumentado 1 puesto en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por Kathyu (11 intervenciones) el 18/11/2019 23:03:32
Hola, he completado un pequeño proyecto en NodeJS y queriendo optimizarlo un poco mas me he topado con lo siguiente.

Cuando ingreso a dominio/img me muestra
1
Cannot GET /img/

ok, a fin de evitar eso hice el siguiente archivo en views con el nombre de 403
1
2
3
4
<div class="container text-center">
	<h2 style="font-family: consolas;">Forbidden,&nbsp;Vault&nbsp;713</h2>
	<img src="../img/403.png" alt="Forbidden">
</div>

Bien, si en el router (archivo de mis rutas) defino la ruta
1
2
3
4
5
router.get('/403',
	(req, res) => {
		res.render('403');
	}
);

Se muestra tal como yo quiero, la cosa es que al aplicar la función
1
2
3
4
5
6
router.get(
	'*',
	(req, res) => {
		res.render('403');
	}
);

No me muestra ninguna imagen en ninguna vista, lo que deseo es que si una ruta no esta definida por mi que muestre la vista del error 403 que ya he definido, y no lo quiero hacer con htacces, claro si con node no es posible pues no problem, pero realmente quiero saber en que esta mi error tal cual como lo tengo.

Yo creo que es un error de lógica con mis inicios en este lenguaje
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de pablo
Val: 46
Ha mantenido su posición en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por pablo (14 intervenciones) el 19/11/2019 16:50:36
Hola Kathyu yo creo que podrías pasarle un parametro adicional que err aparte del request y que ese sea el parametro que te capture el error y una pregunta estas utilizando algún framework como express

1
2
3
4
5
6
router.get(
	'*',
	(err,req, res) => {
		err.render('403');
	}
);

https://expressjs.com/es/guide/error-handling.html

Te dejo esa guía de como hacen el manejo de errores en express.js

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 32
Ha aumentado 1 puesto en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por Kathyu (11 intervenciones) el 19/11/2019 16:53:33
Express y Handlebars como motor de plantillas.

Buscare eso del manejador de errores.

Pero la lógica de lo que quiero hacer esta bien verdad? no necesito htaccess para ello (al menos en Node??)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de pablo
Val: 46
Ha mantenido su posición en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por pablo (14 intervenciones) el 19/11/2019 17:03:45
sí creo que está bien también buscando un poco como veo que lo que quieres es redireccionar podrías usar este metodo
https://expressjs.com/es/4x/api.html#res.redirect

entonces cuando manejes el error algo como:

1
2
3
router.get('*', (res,req,err)=>{
  err.redirect();//y la pagina destino 
});

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 32
Ha aumentado 1 puesto en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por Kathyu (11 intervenciones) el 19/11/2019 17:15:25
No, no quiero redireccionar, quiero mostrar una vista, ya probé el código de la pagina donde usted me dijo

1
2
3
4
5
6
app.use('*',
	(req, res, next) => {
		console.log('error => ' + res.status);
		res.status(500).send('Something broke!');
	}
);

Si lo hago así "funciona", muestra el texto, la cosa es que si cambio por
1
2
3
4
5
6
app.use('*',
	(req, res, next) => {
		console.log('error => ' + res.status);
		res.status(500).render('403'); // Que es mi vista de error
	}
);

Entonces me pinta asi
errNode

Si se fija la vista funciona, el problema es que como he "bloqueado" todo lo que no tenga index con la función, entonces la imagen no se muestra, lo mismo sucede con el index principal, tiene una imagen de background y como todo se bloquea la imagen (todas las imágenes) no se muestran

Creo que de eso depende el problema...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de pablo
Val: 46
Ha mantenido su posición en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por pablo (14 intervenciones) el 19/11/2019 17:45:47
Mandalo así para probar

1
2
3
4
5
6
app.use('*',
	(req, res, next) => {
		console.log('error => ' + res.status);
		res.status(403).render();
	}
);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Kathyu
Val: 32
Ha aumentado 1 puesto en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por Kathyu (11 intervenciones) el 19/11/2019 18:58:55
1
TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type undefined

Parece lógico pues en el render no le manda nada a renderizar.

Es que creo que el problema se da que al bloquear todo con router.get('*', function... bloqueamos el acceso a la carpeta de imagenes por no tener un index, aunque si le pongo un index no hay cambios.

Todo lo que no deseo ver es este mensaje cuando ingrese a la ruta /img o cualquier ruta no definida
1
Cannot GET /img/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de pablo
Val: 46
Ha mantenido su posición en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por pablo (14 intervenciones) el 19/11/2019 20:38:24
bueno yo creo que lo podrías poner así:

1
2
3
4
5
6
7
app.use('*',
	(req, res, next) => {
		console.log('error => ' + res.status);
		res.status(403).render();
            return res.send("Página no disponible");
	}
);

De todos modos tendría que montar un entorno de nodejs en mi casa para buscar pero tendría que probar.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 32
Ha aumentado 1 puesto en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por Kathyu (11 intervenciones) el 19/11/2019 21:32:31
Gracias, eso daría como resultado un texto, voy a buscar mas del tema y si logro algo lo comento luego acá.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de zer0x10
Val: 31
Ha disminuido 1 puesto en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por zer0x10 (7 intervenciones) el 20/11/2019 00:26:20
Hola, una solución al problema que tienes es utilizar el middlware integrado de express, el cual le indica donde se encuentran los archivos estáticos, como pueden ser las imágenes, estilos css, archivos javascript, etc. Este middlware debes usarlo antes de que definas tus rutas, algo así:

1
app.use(express.static(__dirname + '/public'));

En este caso asumo que cuentas con un directorio llamado public y que dentro de esta guardaras todos los archivos publicos de la app (aquí tendrías tu carpeta img).

Ahora, en cuanto al estado http que mencionas 403, es para cuando no se tiene acceso a un recurso, en cambio el status code 404 (Recurso no encontrado) es el que mejor se ajusta a lo que buscas realizar.
Para este caso también podrías valerte de un middlware, el cual deberías situar al final de todas tus rutas (Ya que el orden de estos es importante debido a como trabaja express y como maneja este el ciclo de vida de un request).

El middlware para manejar un 404 seria algo como:

1
2
3
4
5
// Muestra una vista 404
app.use((req, res) => res.status(404).render('404');
 
// O simplemente mostrar un texto
app.use((req, res) => res.status(404).send('404 Not found');

Nos comentas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Kathyu
Val: 32
Ha aumentado 1 puesto en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por Kathyu (11 intervenciones) el 20/11/2019 16:08:45
wow !!

En efecto era el orden, porque yo ya tenia lo del public
1
app.use(express.static(path.join(__dirname, 'public')));

Pero antes habia puesto la funcion y bloqueaba el acceso a lo publico

La deje así, en el index no en el router.js
1
2
3
4
5
6
app.use('/*',
	(req, res, next) => {
		res.render('403');
	}
);

Ahora, lo de los códigos no lo estoy implementando como tal, ya después tomare cada error (500, 404 etc) y muy probable ponga su propia vista, por el momento el 403 lo que hace es poner forbiden o prohibido a cualquier ruta que yo no tenga definida, por eso la vista 403



Pueden ustedes decirme si la forma de definir mi archivo index.js es la ideal ????
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*** Modules ***/
const express = require('express');
const morgan = require('morgan');
const handlerbars = require('express-handlebars');
const path = require('path');
const flash = require('connect-flash');
const session = require('express-session');
const MySQLsession = require('express-mysql-session');
const passport = require('passport');
 
// DB connections
const {database} = require('./keys');
 
/*** Inits ***/
const app = express();
require('./lib/passport');
 
/*** Settings ***/
// Port
app.set('port', process.env.PORT || 3000);
// Views directory
app.set('views', path.join(__dirname, 'views'));
// Templates Engine handlerbars config
app.engine(
	// Handlerbars def
	'.hbs',
	handlerbars({
		// Archivo que manejara todas las vistas
		defaultLayout: 'main',
		// main Dir
		layautsDir: path.join(app.get('views'), 'layouts'),
		// Partials Dir
		partialsDir: path.join(app.get('views'), 'partials'),
		// Extension Files
		extname: '.hbs',
		// Funciones de handlebars
		helpers: require('./lib/handlebars')
	})
);
// Call template engine
app.set('view engine', '.hbs');
 
/*** Middlewares ***/
// Sesiones
app.use(session({
		secret: 'FavoriteLinksOCHOA',
		resave: false,
		saveUninitialized: false,
		store: new MySQLsession(database)
	}
));
// Mensajes
app.use(flash());
// HTTP request
app.use(morgan('dev'));
// Manejar peticiones de usuarios
app.use(express.urlencoded({extended: false}));
// Enviar y Recibir JSON
app.use(express.json());
// Iniciar passport
app.use(passport.initialize());
app.use(passport.session());
 
/*** Global Variables ***/
// Pasa a la siguiente funcion mientras el server procesa los req y res
app.use(
	(req, res, next) =>{
		app.locals.success = req.flash('success');
		app.locals.error = req.flash('error');
		// Cuando serializamos el user, ponemos en variable global toda su info
		app.locals.user = req.user;
		next();
	}
);
 
/*** Routes ***/
app.use(require('./routes/router'));
// Router de las Autenticaciones
app.use(require('./routes/auths'));
// Colocamos un prefijo /links
app.use('/links', require('./routes/links'));
 
 
/*** Public Files ***/
app.use(express.static(path.join(__dirname, 'public')));
 
/*** Evitar ingreso a cualquier archivo/directorio ***/
app.use('/*',
	(req, res, next) => {
		res.render('403');
	}
);

/*** Run Server ***/
app.listen(
	app.get('port'), () => {
		console.log('Server on ' + app.get('port') + ' port...');
	}
);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de zer0x10
Val: 31
Ha disminuido 1 puesto en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por zer0x10 (7 intervenciones) el 20/11/2019 19:07:50
Hola, tu archivo index esta bien organizado, solo recuerda que tanto los middlewars y las rutas se ejuctan en el orden que se encuentran en el código, algo como ocurre con los estilos css por hacer una analogía.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 32
Ha aumentado 1 puesto en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por Kathyu (11 intervenciones) el 20/11/2019 19:19:27
Eso significa que mejor paso la declaración del public a donde pongo la declaración de las views.

Algún otro consejo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de zer0x10
Val: 31
Ha disminuido 1 puesto en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por zer0x10 (7 intervenciones) el 20/11/2019 19:30:37
En lo personal casi siempre lo declaró antes de las vistas, o al menos como el primero de los middlewars.
Otro consejo no se me ocurre en este momento, no llevo mucho tiempo programando en node, tal vez usar variables de entorno para almacenar por ejemplo el secret y los datos de la conexión a la db, pero muchas cosas se aprenden en la práctica y la propia experiencia.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 32
Ha aumentado 1 puesto en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por Kathyu (11 intervenciones) el 20/11/2019 21:42:31
1
2
En lo personal casi siempre lo declaró antes de las vistas, o al menos como el primero de los middlewars.
Otro consejo no se me ocurre en este momento, no llevo mucho tiempo programando en node, tal vez usar variables de entorno para almacenar por ejemplo el secret y los datos de la conexión a la db, pero muchas cosas se aprenden en la práctica y la propia experiencia.

Secret? me puede dar una referencia para leer acerca de eso?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de zer0x10
Val: 31
Ha disminuido 1 puesto en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por zer0x10 (7 intervenciones) el 20/11/2019 21:54:11
El módulo que utilizo se llama dotenv
https://www.npmjs.com/package/dotenv
https://12factor.net/config
Aquí puedes aprender un poco más sobre su uso y la metodología que aplica.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 32
Ha aumentado 1 puesto en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por Kathyu (11 intervenciones) el 20/11/2019 23:01:34
Leeré de ello
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de pablo
Val: 46
Ha mantenido su posición en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por pablo (14 intervenciones) el 20/11/2019 19:32:01
Hola más que un consejo es una pregunta supongo que harás un logín o algo así y a su vez imagino que harás servicios rest, pero la pregunta es por qué colocas importas la librería de passport en este archivo index? deberías de usarlo en el apartado donde usaras la validación del usuario.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de zer0x10
Val: 31
Ha disminuido 1 puesto en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por zer0x10 (7 intervenciones) el 20/11/2019 20:32:53
Porque debe usar los middlewars de passport, el primero para iniciar passport y el segundo para el uso de las sesiones.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 32
Ha aumentado 1 puesto en Node.js (en relación al último mes)
Gráfica de Node.js

Rutas sin index con NodeJS

Publicado por Kathyu (11 intervenciones) el 20/11/2019 21:43:02
Tal cual dice zer0x10

Ya tengo login, logout, singup, todo. Ahorita haré algo tipo red social de imágenes para aprender mas conceptos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar