翡翠中的variables,全局对象和console.log

我用快速框架创build了一个应用程序,它以玉为模板引擎。 在玩弄玉石的同时,我设定了一个简单的testing:

在Node中,我将一个对象传递给jade模板渲染res.render('index', { title: 'Express', docs:"is jade cool?"}); ,并在模板中,我试图调用这样的值:

  h1= title p Hi! p Welcome to #{title} p #{docs} - console.log(docs) script(type='text/javascript'). console.log(docs); 

我发现我无法控制login全局对象值,如果我尝试#{docs} ,它会尝试将它parsing为一个字面命令,而不是它开始的string。 我也发现,我不能把它分配给一个JS var,像这样: var test = #{docs};

有人可以解释:

  • #{docs}!{docs}docs什么区别? (奇怪的是,所有三个例子都在文档中使用,但是没有一个是真正解释的。)
  • 什么是正确的方式来控制login从节点传递给玉的全局对象属性和正确的方式来分配这些相同的属性本地JSvariables?

#{docs},!{docs}和docs之间有什么区别(奇怪的是,这三个例子都在文档中使用,但是没有一个真的被解释)

 //This will output literal HTML <p>docs</p> p docs 

示例命令行:

 echo "p docs" | jade <p>docs</p> 

 //This will interpolate the variable docs into a string //and also escape any HTML it may contain: <p>is jade cool?</p> //To see what I mean, try passing docs: "jade is <b>cool</b>" (contains HTML) //you'll get <p>jade is &lt;b&gt;cool&lt;/b&gt;</p> p #{docs} //This syntax is another flavor of the above p= docs 

示例命令行:

 echo 'p #{docs}' | jade --obj '{docs: "jade is <b>cool</b>"}' <p>jade is &lt;b&gt;cool&lt;/b&gt;</p> echo 'p= docs' | jade --obj '{docs: "jade is <b>cool</b>"}' <p>jade is &lt;b&gt;cool&lt;/b&gt;</p> 

 //This will do the same but NOT escape HTML //The exclamation point is supposed to convey warning //because this can be a XSS vulnerability p !{docs} 

示例命令行:

 echo 'p !{docs}' | jade --obj '{docs: "jade is <b>cool</b>"}' <p>jade is <b>cool</b></p> echo 'p!= docs' | jade --obj '{docs: "jade is <b>cool</b>"}' <p>jade is <b>cool</b></p> 

控制台logging从节点传递给jade的全局对象属性的正确方法是什么,以及将相同属性分配给本地jsvariables的正确方法是什么

想要这样做是非常普遍的,天真的/不安全的答案是这样的:

 script(type="text/javascript")!= "var myData = " + JSON.stringify(myData) 

我可以通过testing

 jade --obj '{myData: {foo: "FOO"}}' < t1.jade 

并得到

 <script type="text/javascript">var myData = {"foo":"FOO"}</script> 

但是,将JSON数据安全地embedded到HTML文档中的规则很棘手( 详细信息在这里 ),所以我强烈build议使用一个诸如sharify这样的辅助模块,以确保数据安全地传递到HTML中。