2017-03-12 3 views
0

Ich fing an, eine kleine Website in NodeJS zu entwickeln, mit Admin-Authentifizierung basierend auf https://github.com/DanialK/Simple-Authentication, es funktioniert sehr gut.NodeJS kann nicht meine DB-Werte für meine Vorlage nehmen

Ich kann einen Benutzer erstellen, mit ihm anmelden und die private Seite (Dashboard) sehen. Aber ich habe ein Problem mit meiner Vorlage (ich verwende Nunjucks), wenn der Admin zu seinem Armaturenbrett komme ich wan't nur um zu zeigen:

angemeldet als: ‚admin_username‘.

Dies ist mein Code:

Modell:

const UserSchema = new mongoose.Schema({ 
    username: String, 
    email: String, 
    password: String, 
    salt: String, 
    hash: String 
}) 

Modell Definition:

const User = mongoose.model('user', UserSchema) 

Meine Route:

So sende ich "user", sollte in meiner Vorlage verwendet werden:

{% extends "base/layout.njk" %} 

{% block content %} 
admin:dashboard page <br /><br /><br /> 

{% if sessionFlash.message %} 
    <div class="{{ sessionFlash.type }}"> 
    {{ sessionFlash.message }} 
    </div> 
{% endif %} 

You are logged as : {{ user.username }} 

{% endblock %} 

Mit user.username ich nicht den Benutzernamen erhalten können. Mit Benutzer nur ich bekomme das gesamte Dokument aus der DB, Benutzername, E-Mail, Salz, Hash.

Dies ist das Ergebnis des console.log (Benutzers) von der Route:

[ { _id: 58c58ad8a5e54c00117ce85b, 
username: 'test', 
email: 'test', 
salt: '/71BBVmr8E3b/HUz8L89IWLV7xM/vG9nvJRGzQYPw4dwR8GICr0kJtGs8dqwNzsMU7yki9aa2WM7C2NRxf/ausw+4kyiLojfugYzdrh+6obBq5HcZPZfQq+djwsTyyd+CDPJ/EmbUQyIL1yM7lRLfkhfrCIZ9P1mJZZM9fv4thw=', 
hash: '��F\u0000\u000b ��a�\u001c|A˓P�N&��\u0010�5ajd�7{c �@�mQ����&��W�rW\'�+������\u0013����������N�4�y>/1��R\u001ca>���=U�u<9�T�o" \u000b�����Ʌ^�\u0004\u001f��\u0007�B`A�d���[email protected]$���', 
__v: 0 } ] 

Sie wissen nicht, ob dies wichtig ist, gibt es die zwei Funktion zur Authentifizierung verwendet: requiredAuthentication und authentifizieren:

function authenticate(name, pass, fn) { 
if (!module.parent) console.log('authenticating %s:%s', name, pass); 

User.findOne({ 
    username: name 
}, 

function (err, user) { 
    if (user) { 
     if (err) return fn(new Error('cannot find user')); 
     hash(pass, user.salt, function (err, hash) { 
      if (err) return fn(err); 
      if (hash == user.hash) return fn(null, user); 
      fn(new Error('invalid password')); 
     }); 
    } else { 
     return fn(new Error('cannot find user')); 
    } 
}); 
} 

function requiredAuthentication(req, res, next) { 
    console.log("#### ->REQUIREDAUTHENTICATION() ####") 
    if (req.session.user) { 
    console.log("#### AUTH NEXT() ####") 
    next(); 
    } else { 
    console.log("#### AUTH DIE() ####") 
    req.session.sessionFlash = { 
     type: 'alert alert-success', 
     message: 'You can't access the dashboard' 
    } 
    res.redirect('/admin/account/login'); 
    } 
} 

Dank für das helfen Sie mir, wenn Sie zusätzliche Informationen wan't mich fragen.

Antwort

0

Sieht aus wie das user Objekt ist eigentlich ein Array mit 1 Element. Sie können dies durch die führende [ in der Ausgabe console.log sagen. Um das Problem zu beheben, können Sie entweder user[0] an Ihre Renderfunktion übergeben oder eine for-Schleife zu Ihrer Vorlage hinzufügen, falls Sie später mehrere Benutzer greifen.

+0

Vielen Dank, es funktionierte, in meiner Vorlage habe ich verwendet: {{user [0] .username}}, aber es ist seltsam, weil auf einem anderen Projekt {{something.title}} gut funktionieren! – Dlazzy

+0

Froh, es hat funktioniert! Sie können nicht immer davon ausgehen, dass eingehende Daten ein einzelnes Objekt oder Array sein werden, es hängt nur davon ab, welche API Sie verwenden. Wenn ich mich recht erinnere, wird die Model.find() - Methode in Mungo immer ein Array zurückgeben, aber zitiere mich nicht auf diesem =) –

Verwandte Themen