将用户数据传递给客户端

passing user data to the client

本文关键字:客户端 数据 用户 用户数      更新时间:2023-09-26

我使用nodejs, express, mongoose和passport进行认证。
我有一个名为User的猫鼬模型,它保存用户数据(大量数据)。
不,我想创建一个路由来呈现index。并在模板中设置用户数据。
我的路线是:

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. 我不希望客户端获得整个User结构。我只需要几个属性,仅此而已。我从Java和。net中知道有一个术语"数据传输对象",它表示一个对象的目的是将数据传递给客户端。在节点上等价的是什么?只向客户端传递相关数据的最佳实践是什么?

  2. 客户端需要用户id来识别用户。我不想传递mongo原始用户文档_id。我能做什么?我是否需要以某种方式编码id ?

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

您可以序列化对象以便在客户端使用

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