0

我正在使用 nodejs、express、mongoose 和 passport 进行身份验证。
我有一个名为 User 的猫鼬模型,它包含用户数据(大量数据)。
不,我想创建一个呈现 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 进行编码?

4

2 回答 2

1

当您这样做时res.render,除了您在模板中使用的变量之外,您实际上不会从变量向您的客户端发送任何内容,因此基本上如果您只想传递用户的用户名,您可以安全地执行(通过 DRY 改进):

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,您可以使用任何其他唯一的用户属性作为用户名、电子邮件地址等。

于 2013-05-29T07:57:57.303 回答
0

You could serialize the object for use on the client

doctype 5
html(lang="en")
    head
    body
        script(type='text/javascript')
            window.user = !={JSON.stringify(user)};

You could serialize on the server too

app.get('/something', function(req, res) {
    res.render('index', {
        user: JSON.stringify(req.user || {})
    });
});

and just assign it in the view

script(type='text/javascript')
    window.user = =#{user};
于 2013-05-29T17:45:47.177 回答