我使用nodejs,express,mongoose和passport进行身份验证 我有一个名为User的mongoose模型,它保存用户数据(很多数据) 不,我想创建一个呈现index.jade并在模板中设置用户数据的路由 我的路线是:
app.get('/something', function(req, res) {
res.render('index', {
user: req.user || {}
});
});
我的模板:
doctype 5
html(lang="en")
head
body
script(type='text/javascript')
window.user = #{user};
我遇到以下两个问题:
我不希望客户端获得整个用户结构。我只需要几个属性就可以了。我从Java和.NET中了解到,有一个术语“数据传输对象”表示一个对象,其目的是将数据传递给客户端。节点中的等价物是什么?在传递客户端的节点中,只有相关数据的最佳做法是什么?
客户端需要用户ID才能识别用户。我不想传递mongo原始用户文档_id。我能做什么?我应该以某种方式对id进行编码吗?
答案 0 :(得分:1)
当您执行res.render
时,除了您在模板中使用的变量之外,您实际上不会从变量向您的客户端发送任何内容,所以基本上如果您只想传递用户的用户名,您可以安全地执行此操作(干旱改善):
render = function(page, req, res) {
res.render(page, { user: req.user ? req.user : {} });
};
app.get('/something', function(req, res) { render('index', req, res); });
app.get('/pageA', function(req, res) { render('pageA', req, res); });
app.get('/pageB', function(req, res) { render('pageB', req, res); });
或强>
doctype 5
html(lang="en")
head
body
script(type='text/javascript')
| window.user = "#{user.username}";
如果您想要更复杂的用户对象,您可以随时执行:
doctype 5
html(lang="en")
head
body
script(type='text/javascript')
| window.user = { username: "#{user.username}", email: "#{user.email}" };
基本上,这不会将您的user
对象公开给客户端,只会暴露给节点查看器实例的渲染功能。
关于用户ID,您可以使用任何其他唯一用户属性作为用户名,电子邮件地址等。
答案 1 :(得分:0)
您可以序列化对象以在客户端上使用
doctype 5
html(lang="en")
head
body
script(type='text/javascript')
window.user = !={JSON.stringify(user)};
您也可以在服务器上序列化
app.get('/something', function(req, res) {
res.render('index', {
user: JSON.stringify(req.user || {})
});
});
并在视图中分配
script(type='text/javascript')
window.user = =#{user};