【问题标题】:Handlebars js access one element from nested objectHandlebars js从嵌套对象中访问一个元素
【发布时间】:2017-01-05 23:16:21
【问题描述】:

我有一个 nodejs 应用程序。我正在使用车把 js 作为视图引擎。我正在尝试从要传递给 hbs 视图的嵌套对象中访问一个元素。

router.get('/view_users/:id', function (req, res, next) {
Users.find({ userId: req.params.id }, function (err, users) {
    if (err) {
        throw err;
    } else {
        res.render('view_user', { title: 'Users', user: users});
    }
})

});

然后在 view_user 中我只想访问一个 users.name.<p>{{users.name}}</p>(没有内置帮助器,例如 #each,因为它会返回所有用户的列表)

我尝试了{{user.name}}{{name}} 和 {{{user.name}}},但它返回给我未定义。

Users 是 mongoose Schema。

我该怎么做?谢谢。

【问题讨论】:

  • {{title}} 工作吗?
  • 是的,它工作正常
  • 我认为是用户对象的问题
  • 嗯,看起来是的。你可以在调用render 方法之前做一个console.log(JSON.stringify(users)); 吗?
  • 它打印对象[{"_id":"586abcad062b2b1254bb5303","name":"Test3423","description":"","departmen tName":"Test3","__v": 0,"departmentId":["5864345ef7834d3fc07d8d6c"]}]

标签: javascript node.js express handlebars.js


【解决方案1】:

find() 方法将返回一个文档列表。这就是为什么你得到 (来自您上面的评论):object[{"_id":"586abcad062b2b1254bb5303","name":"Test3423","‌​description":"","dep‌​artmen tName":"Test3","__v":0,"departmentId":["5864345ef7834d3fc07d‌​8d6c"]}]。这是一个数组,里面有你的模型。

改用findOne 方法,它将直接返回用户文档。您使用 userId 提出请求,因此您将始终获得好的文档。

您可以从文档中了解更多信息:http://mongoosejs.com/docs/queries.html

在 Mongoose 中将回调传递给查询的任何地方,回调都遵循模式 callback(error, results)。结果取决于操作:对于findOne(),它是一个可能为空的单个文档,find() 是一个文档列表,count() 是文档数,update() 是受影响的文档数等。 API模型文档提供了有关传递给回调的内容的更多详细信息。

另一种解决方案是获取用户数组的第一个元素:

res.render('view_user', { title: 'Users', user: users[0] });

希望对你有帮助。

【讨论】:

  • 感谢您的帮助。
【解决方案2】:

如果您想搜索特定用户,请使用 findOne,它将提供一个用户对象。 find 将返回一个用户/用户数组。

试试这个:

router.get('/view_users/:id', function(req, res, next) {
    Users.findOne({ userId: req.params.id }, function(err, user) {
        if (err) {
            throw err;
        } else {
            res.render('view_user', { title: 'Users', user: user });
        }
    })
})

或者

如果您只有一个用户,则使用数组的第一个元素(不推荐用于多个用户集)。

res.render('view_user', { title: 'Users', user: users[0]});

或者

在视图中迭代(推荐用于多个用户列表)

   {{#each this}}
        {{name}}
    {{/each}}

这是一个简化的小提琴来显示我在问什么:http://jsfiddle.net/KPCh4/2/

快乐编码:)

【讨论】:

  • 感谢您的帮助。
  • 我想知道为什么不能使用 Handelbars 直接引用对象中的属性。 Users.findOne() 返回单个用户对象,例如 {name: "John", email: "john@example.com"}。在视图中,您似乎只能通过{{#each}} 迭代器访问它,而不是直接使用{{user.name}}
猜你喜欢
  • 2019-06-13
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多