在 node.js 中将数组传递给玉模板时遇到问题

Posted

技术标签:

【中文标题】在 node.js 中将数组传递给玉模板时遇到问题【英文标题】:Having problems with passing array to jade template in node.js 【发布时间】:2013-12-16 04:02:47 【问题描述】:

我正在尝试传递要在屏幕上显示的新闻数组,但不知何故我在浏览器的结果中得到了空数组

routes/rss.js

...
var news = [];
...
          var this_news =  
            'title': item.title,
            'description': item.description
             
          news.push(this_news);
...
  res.render('rss',  
    title: 'Node.js based RSS reader',
    newsi: JSON.stringify(news)
  ); 

views/rss.jade

extends layout

block content
  h1= title
  p Welcome to #title
  p Sure why not 
  script(type='text/javascript').
    var inews = !newsi;

编辑

好的,所以我得出的结论是问题出在我的“非回调逻辑”上

这是我的代码:

var FeedParser = require(__dirname + '/../node_modules/feedparser')
  , request = require(__dirname + '/../node_modules/request');

exports.news = function(req, res)

  var news = []; 
    request('http://feeds.feedburner.com/niebezpiecznik/')
    .pipe(new FeedParser())
      .on('error', function(error) 
        //...
      )  
      .on('meta', function (meta) 
        console.log('===== %s =====', meta.title);
        console.log('**** %s ****', meta.description);
        console.log();
      )  
      .on('readable', function() 
        var stream = this, item;
        while (item = stream.read()) 

          var this_news =  
            'title': item.title,
            'description': item.description
             
          news.push(this_news);

           
        res.render('rss',  
          title: 'Node.js based RSS reader',
          newsi: JSON.stringify(news)
        ); 
    ); 

;

它几乎可以工作,但它给我带来了未处理的异常。我应该如何处理?

【问题讨论】:

【参考方案1】:

您可以将其作为数组传递,渲染时无需对其进行字符串化。然后在你的翡翠方面,如果你只想循环通过,你可以使用for & each。

要让它作为对象传递给script,尽管您使用带单引号的感叹号,然后解析您的对象以便您可以使用它。但是,如果您要将它作为对象传递给脚本而不使用 Jade 的内置迭代,那么您将需要在您的 rss.js 上进行字符串化。

routes/rss.js

...
var news = [];
...
          var this_news =  
            'title': item.title,
            'description': item.description
             
          news.push(this_news);
...
  res.render('rss',  
    title: 'Node.js based RSS reader',
    newsi: JSON.stringify(news)
  ); 

views/rss.jade

extends layout

block content
  h1= title
  p Welcome to #title
  p Sure why not
  script(type='text/javascript').
    // Pass as regular array here
    var inews = JSON.parse('!newsi');
    console.log(inews);

【讨论】:

我在生成的网站中收到var inews = ;,但没有显示任何内容。 我对它进行了更多研究,并意识到我错误地传递了您想要的结果。我已经更新了,应该是你现在需要的。 你说你不需要字符串化,但是在你给出的例子中你正在使用字符串化。你能对此发表评论吗?你真的可以不使用 stringify 吗? Errr 我读得有点快,如果我理解正确的话,只有在需要在脚本块内访问对象时才需要字符串化。 是的,没错。如果要将对象与视图的渲染一起使用(即循环数组以渲染到表),则不需要进行字符串化。但是,如果您想使用客户端 JavaScript 访问该对象,则需要对其进行字符串化以进行渲染,然后在客户端上进行解析以使用它。如果您想在客户端使用该变量并且不想在服务器端呈现,那么从客户端 JS 代码发出 HTTP 请求并在收到对象后对对象执行任何操作会更有意义

以上是关于在 node.js 中将数组传递给玉模板时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaScript node.js 中将 xml 文件解析为数组

如何在 node.js 子进程模块中将消息和标准输出从子进程传递给父进程?

如何在 node.js 环境中将查询语句传递给 bigquery

Socket.io、Node.js:如何在 javascript.js 中将 javascript 变量传递给 mysql 查询?

如何在node.js中将json数组数据插入mysql?

ExpressJS 3.0 如何将 res.locals 传递给玉视图?