为啥我的 json 对象的 `email` 属性不会显示在我的玉模板中?

Posted

技术标签:

【中文标题】为啥我的 json 对象的 `email` 属性不会显示在我的玉模板中?【英文标题】:Why won't the `email` property of my json object display in my jade template?为什么我的 json 对象的 `email` 属性不会显示在我的玉模板中? 【发布时间】:2012-04-16 06:26:59 【问题描述】:

遇到最奇怪的问题。我无法显示对象的email 属性。我正在使用 Mongoose/Express/Jade。我正在做一个:

User.find( _id :  $in : req.project.subscribers   , function (err, subs)...

效果很好,并在 subs var 中返回我的订阅者列表,如下所示:

 _id: 4f34832b9398bec847000002,
  email: 'steve@example.com',
  first_name: 'Steve',
  last_name: 'McQueen',
  status: 'active',
  username: 'steve',
  updated_at: Fri, 10 Feb 2012 02:38:35 GMT,
  created_at: Fri, 10 Feb 2012 02:38:35 GMT,
  role: 'subscriber' ,

   _id: 4f3484a9eceb82b548000002,
  email: 'paul@example.com',
  first_name: 'Paul',
  last_name: 'Stanley',
  status: 'active',
  username: 'paul',
  updated_at: Mon, 02 Apr 2012 15:09:56 GMT,
  created_at: Mon, 02 Apr 2012 15:09:56 GMT,
  role: 'subscriber' 

然后我将它传递给我的翡翠视图中的一个名为订阅者的变量。 到目前为止一切顺利,当我在我的翡翠模板中迭代 subscribers 时,我想显示每个订阅者的 email 属性时出现了问题。出于某种原因,这只是email 的问题! email 没有显示任何内容,只是空白。

ul
  each sub in subscribers
    li= sub.email

如果我用任何其他属性代替email,它就可以正常工作。因此,以下显示完全正常:

ul
  each sub in subscribers
    li= sub.username

如果我能提供更多细节,请告诉我。

为 Declan 编辑:

执行以下操作:

ul
    each val, key in subscribers
     li #key: #val

产量:

    0:  _id: 4f34832b9398bec847000002, email: 'foo', first_name: 'Steve', last_name: 
'McQueen', status: 'active', username: 'steve', updated_at: Fri, 10 Feb 2012 02:38:35 GMT, 
created_at: Fri, 10 Feb 2012 02:38:35 GMT, role: 'subscriber' 

1:  _id: 4f3484a9eceb82b548000002, email: 'foo', first_name: 'Paul', last_name: 'Stanley', 
status: 'active', username: 'paul', updated_at: Mon, 02 Apr 2012 16:05:51 GMT, created_at: 
Mon, 02 Apr 2012 16:05:51 GMT, role: 'subscriber' 

【问题讨论】:

如果只是为了测试,你在你的控制器中添加循环并尝试 console.log 其中的每个子,它显示了什么?你的财产在里面吗? 是的,它正在显示,这就是我复制和粘贴整个对象的地方。 我想知道翡翠是否对电子邮件中的特殊字符有问题。您是否尝试过删除 @ 和 .并测试它们是否导致了问题? @DeclanCook 好主意,但不行。我将所有电子邮件帐户值设置为 foo,但问题仍然存在。 很奇怪,你是否厌倦了使用符号:每个 val,key in obj li #key: #val 【参考方案1】:

我正在回答我自己的问题,因为它最终变得愚蠢而明显(通常是,不是吗?)。

当使用 mongoose 并且某个属性未显示时,请确保您已在 mongoose 架构中定义了该属性。不知何故,我在创建架构时忽略了电子邮件字段,只是没有定义它。即使它在数据库中的实际记录中,猫鼬也不在乎,只会向您显示您为对象/模式定义的内容。

感谢大家的努力,如果没有别的,你帮助我得到了我的答案。

【讨论】:

【参考方案2】:

作为答案发布以允许更好的代码格式。

我刚回到家,整理了一个测试应用程序,看看我是否可以复制你的错误。到目前为止,我一直无法。这是我的文件

注意:我没有使用数据库进行测试,因此问题可能是您如何将数据库中的数据获取到模板中:

index.jade

ul
  each sub in subscribers
    li= sub.email

路由/index.js

exports.index = function(req, res)
  res.render('index',  subscribers: [ "_id": "4f34832b9398bec847000002",  "email": "steve@example.com",  "first_name": "Steve",  "last_name": "McQueen",  "status": "active",  "username": "steve",  "updated_at": "Fri, 10 Feb 2012 02:38:35 GMT",  "created_at": "Fri, 10 Feb 2012 02:38:35 GMT",  "role": "subscriber" ,   "_id": "4f3484a9eceb82b548000002",  "email": "paul@example.com",  "first_name": "Paul",  "last_name": "Stanley",  "status": "active",  "username": "paul",  "updated_at": "Mon, 02 Apr 2012 15:09:56 GMT",  "created_at": "Mon, 02 Apr 2012 15:09:56 GMT",  "role": "subscriber" ] )
;

app.js

var express = require('express')
  , routes = require('./routes');

var app = module.exports = express.createServer();

// Configuration

app.configure(function()
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
);

app.configure('development', function()
  app.use(express.errorHandler( dumpExceptions: true, showStack: true ));
);

app.configure('production', function()
  app.use(express.errorHandler());
);

// Routes

app.get('/', routes.index);

app.listen(8000);
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);

您能否发布您的路线/app.get 函数以及所有数据库处理代码?

【讨论】:

我只是控制台记录了数据库的结果,正如预期的那样,所有属性看起来都不错,包括电子邮件。但是,然后我遍历了每条记录中的所有属性,控制台记录了键:值对,所有内容都显示了,除了电子邮件。这是我的路线图:pastie.org/3722045【参考方案3】:

玉对我来说看起来很合适,也许它是您的请求处理程序中的某些内容,以及您如何将它添加到要呈现的视图中。这个简单的例子有效:

服务器端请求处理程序...

app.get('/', function(req, res) 
    var users = [
        _id: '4f34832b9398bec847000002',
        email: 'steve@example.com',
        first_name: 'Steve',
        last_name: 'McQueen',
        status: 'active',
        username: 'steve',
        updated_at: "Fri, 10 Feb 2012 02:38:35 GMT",
        created_at: "Fri, 10 Feb 2012 02:38:35 GMT",
        role: 'subscriber'
    , 
        _id: '4f3484a9eceb82b548000002',
        email: 'paul@example.com',
        first_name: 'Paul',
        last_name: 'Stanley',
        status: 'active',
        username: 'paul',
        updated_at: "Mon, 02 Apr 2012 15:09:56 GMT",
        created_at: "Mon, 02 Apr 2012 15:09:56 GMT",
        role: 'subscriber'
    ];
    res.render('index.jade', subscribers : users );
);

index.jade 的内容...

html
    body
        ul
            each sub in subscribers
                li= sub.email

输出...

<html>
    <body>
        <ul>
            <li>steve@example.com</li>
            <li>paul@example.com</li>
        </ul>
    </body>
</html>

【讨论】:

感谢您的测试。我认为这可能与 Mongoose 如何返回对象有关。我不认为它会作为一个实际的数组回来。当我 console.log 来自 Mongoose 的结果(subs)时,我只看到 2 个逗号分隔的对象,就像我在原始帖子中显示的那样。不确定这是对的。 @k00k,没错。当您 console.log 一个数组时,它会执行一个 toString,它返回一个以逗号分隔的数组值列表。

以上是关于为啥我的 json 对象的 `email` 属性不会显示在我的玉模板中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Mongoose 不允许我访问 JSON 属性?

为啥 JSON.stringify 为似乎具有属性的对象返回空对象表示法“”?

json属性名为啥要双引号

为啥我的属性路由不起作用?

传入的 JSON 对象不包含 client_email 字段

为啥我的 JSON 数组会变成一个对象?