在node + express + jade中向客户端传递对象?

42

我在服务器上有一个非常耗费资源的查询,会导致页面重新渲染,我想将一些查询结果传递给客户端(作为JavaScript对象数组)。这样做主要是为了避免以后再进行一次JSON查询来获取相同的内容(这些内容大部分是静态的)。数据最终会很有用,但起初并不是,所以我没有直接将其放入文档中。

app.get('/expensiveCall', function(req, res) {
    // do expensive call
    var data = veryExpensiveFunction();
    res.render('expensiveCall.jade', {
        locals: {
                data: data,
                }
        });
    });
});

data是一个对象数组,只有一部分最初被使用。我想要传递整个数据或一些子集(根据不同情况而定)。我的jade看起来像普通的jade,但我想包含类似于:

<script type="text/javascript">
var data = #{data};
</script>

但是这个方法不起作用(它是一个对象数组)。

1个回答

89

你不能像那样内联一个JS对象,但是你可以在此之前使用 JSON.stringify 进行转换:

<script type="text/javascript">
  var data = !{JSON.stringify(data)};
</script>

1
抱歉之前应该说得更清楚:Jade转义所有发出的内容,这意味着我还需要取消转义,并且不清楚如何关闭转义。我认为在Express中有一些方法可以做到这一点,但我不确定具体是什么。我可能会切换到另一个模板引擎,但这意味着要分叉代码 :-(。 - killermonkeys
10
如果您使用!{}代替#{},则应该关闭转义。 - Adrien
如果视图重新渲染,变量的值会被更新吗? - user1736947
@Adrien,感谢你的帮助,但是你的代码会将字符串化的JSON直接渲染到JavaScript中,从而导致语法错误。你可以通过在!{}周围加引号来轻松解决这个问题。 - Crazy Redd
感谢你提供的好解决方案。 - haotang
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接