将用户数据传递给客户端

时间:2013-05-29 07:38:05

标签: javascript node.js mongodb express mongoose

我使用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};

我遇到以下两个问题:

  1. 我不希望客户端获得整个用户结构。我只需要几个属性就可以了。我从Java和.NET中了解到,有一个术语“数据传输对象”表示一个对象,其目的是将数据传递给客户端。节点中的等价物是什么?在传递客户端的节点中,只有相关数据的最佳做法是什么?

  2. 客户端需要用户ID才能识别用户。我不想传递mongo原始用户文档_id。我能做什么?我应该以某种方式对id进行编码吗?

2 个答案:

答案 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};