NodeJS 无法将我的数据库值用于我的模板
NodeJS can't take my DB values for my template
我开始用 NodeJS 开发一个小网站,基于 https://github.com/DanialK/Simple-Authentication 的管理员身份验证,它工作得很好。
我可以创建一个用户,用它登录并查看私人页面(仪表板)。
但是我的模板有问题(我正在使用 Nunjucks),当管理员来到他的仪表板时我不想显示:
记录为:'admin_username'。
这是我的代码:
型号:
const UserSchema = new mongoose.Schema({
username: String,
email: String,
password: String,
salt: String,
hash: String
})
模型定义:
const User = mongoose.model('user', UserSchema)
我的路线:
router.route('/admin/dashboard', requiredAuthentication)
.get((req, res) => {
console.log("################ GET DASHBOARD ##################")
requiredAuthentication(req, res, function() {
User.find().then(user => {
res.render('admin/dashboard.njk', {user: user})
console.log(user)
}).catch(err => {
console.error(err)
})
})
})
所以我发送"user",应该用在我的模板中:
{% 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 %}
使用user.username我无法获取用户名。
只有 user 我才能从数据库、用户名、电子邮件、salt、哈希中获取整个文档。
这是 console.log(user) 来自路由的结果:
[ { _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���N@M$���',
__v: 0 } ]
不知道这是否重要,有两个用于身份验证的函数:requiredAuthentication 和 authenticate :
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');
}
}
感谢您帮助我,如果您需要更多信息,请问我。
看起来 user
对象实际上是一个包含 1 项的数组。您可以通过 console.log 输出中的前导 [
来判断。要解决此问题,您可以将 user[0]
传递给您的渲染函数,或者向您的模板添加一个 for 循环,以防您稍后会吸引多个用户。
我开始用 NodeJS 开发一个小网站,基于 https://github.com/DanialK/Simple-Authentication 的管理员身份验证,它工作得很好。
我可以创建一个用户,用它登录并查看私人页面(仪表板)。 但是我的模板有问题(我正在使用 Nunjucks),当管理员来到他的仪表板时我不想显示:
记录为:'admin_username'。
这是我的代码:
型号:
const UserSchema = new mongoose.Schema({
username: String,
email: String,
password: String,
salt: String,
hash: String
})
模型定义:
const User = mongoose.model('user', UserSchema)
我的路线:
router.route('/admin/dashboard', requiredAuthentication)
.get((req, res) => {
console.log("################ GET DASHBOARD ##################")
requiredAuthentication(req, res, function() {
User.find().then(user => {
res.render('admin/dashboard.njk', {user: user})
console.log(user)
}).catch(err => {
console.error(err)
})
})
})
所以我发送"user",应该用在我的模板中:
{% 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 %}
使用user.username我无法获取用户名。 只有 user 我才能从数据库、用户名、电子邮件、salt、哈希中获取整个文档。
这是 console.log(user) 来自路由的结果:
[ { _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���N@M$���',
__v: 0 } ]
不知道这是否重要,有两个用于身份验证的函数:requiredAuthentication 和 authenticate :
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');
}
}
感谢您帮助我,如果您需要更多信息,请问我。
看起来 user
对象实际上是一个包含 1 项的数组。您可以通过 console.log 输出中的前导 [
来判断。要解决此问题,您可以将 user[0]
传递给您的渲染函数,或者向您的模板添加一个 for 循环,以防您稍后会吸引多个用户。