Tengo una aplicación node.js básica que sirve un index.html estático que contiene una aplicación JS. Tengo una ruta de inicio de sesión que valida un nombre de usuario / pwd en mi base de datos mongo y redirige a '/':

app.post('/login', function(req,res) {
    let inputUser=req.body.username;
    let inputPwd=req.body.password;

    findUser({'username':inputUser},function(data){
        if ((data[0].srnm===inputUser)&&(data[0].psswd===inputPwd))
        {
            res.redirect('/');
        }
        else
        {
            res.writeHead(200);
            res.write(`INVALID USERNAME OR PASSWORD TRY AGAIN OR GO AWAY`);
            res.end();
        }
    });
});

Mi index.html contiene una aplicación script.src JS.

app.get('/', function (req, res) {
    res.sendFile(path.join(__dirname+'/index.html')); 
});

Quiero acceder a un indicador IS_LOGGED_IN en este script.

¿Cómo paso el script esta información? ¿Necesito hacer una solicitud AJAX / ponerla en un encabezado antes de mi redirección de alguna manera? ¿O es mi enfoque de alguna manera defectuoso? Lo siento si esto es descaradamente obvio. Soy muy nuevo en node (y también necesito aprender async.js / promises para evitar el infierno de devolución de llamadas). Gracias.

1
thmsdnnr 13 ene. 2017 a las 21:44

3 respuestas

La mejor respuesta

Un buen enfoque es utilizar un Template Engine en lugar de servir un archivo .html puro, por lo que:

Gestión de la ruta del índice:

  1. Instale un motor de plantilla básico npm install ejs --save
  2. Úselo como Express Template Engine app.set('view engine', 'ejs')
  3. Establezca la ruta de vistas app.set('views', path.join(__dirname, 'views'));
  4. Render app.get('/'. (req, res) => res.render('Index', {IS_LOGGED: true });
  5. Index.ejs <script>window.INITIAL_STATE = {IS_LOGGED: <%- IS_LOGGED %>}; </script>

Administrar la API de inicio de sesión:

En lugar de res.write(200); ...INVALID USERNAME..., responda con un código de estado más coherente para que su cliente pueda entender cuándo una solicitud de inicio de sesión está hecho.

app.get('/login', (req, res) => res.status(401).end());

1
Hitmands 13 ene. 2017 a las 19:22

Si todo lo que desea hacer es indicar a su secuencia de comandos en la página que un usuario ha iniciado sesión, la forma más fácil sería establecer una cookie en la secuencia de comandos de inicio de sesión.

res.cookie('loggedIn', 'true')

Luego acceda desde su script.

<script type="text/javascript">
        function setCookie(key, value) {
            var expires = new Date();
            expires.setTime(expires.getTime() + (1 * 24 * 60 * 60 * 1000));
            document.cookie = key + '=' + value + ';expires=' + expires.toUTCString();
        }

        function getCookie(key) {
            var keyValue = document.cookie.match('(^|;) ?' + key + '=([^;]*)(;|$)');
            return keyValue ? keyValue[2] : null;
        }

    if (getCookie('loggedIn')) {
        document.write('User is logged in')
    }
</script>
0
djones 13 ene. 2017 a las 19:05

Puede usar el script Ajax, luego debe pasar una respuesta JSON

res.send({IS_LOGGED_IN: true})

O pase su marca como una sesión flash utilizando el módulo express-flash (https: //www.npmjs. com / package / express-flash)

Ejemplo

req.flash('IS_LOGGED_IN', true);

En la página html render obtienes tu bandera de la siguiente manera:

app.get(function(req, res, next){
    return res.render('index.html', {
        IS_LOGGED_IN: req.flash('IS_LOGGED_IN'),
    });
});
0
Med Lazhari 13 ene. 2017 a las 18:57