【问题标题】:Express, EJS, challenge with testing for undefinedExpress、EJS、未定义测试的挑战
【发布时间】:2012-05-14 05:31:19
【问题描述】:

我正在使用 express 框架使用 nodejs 创建一个简单的网站,couchdb 用于数据库,EJS 用于模板。有时我的某些字段在我的某些 JSON 文档中为 null 或未定义,我需要处理它。

<% if (typeof test !== 'undefined') { %>
  <p><%= test %></p>
<% } %>

那段代码似乎可以很好地处理未定义的“测试”字段,但下面的代码会抛出一个错误,提示“测试未定义”

<% if (test) { %>
  <p><%= test %></p>
<% } %>

为什么 javascript 不理解 test 是未定义的,然后只在 if 子句中输入 false ?

【问题讨论】:

  • ... 因为它的 undefined 不是 false :?我个人很高兴它不像“哦,嘿,兄弟,你一定是说这个未定义是假的”

标签: node.js express ejs


【解决方案1】:

要检查是否定义了测试,您需要这样做:

<% if (this.test) { %>
   here, test is defined
<% } %>

【讨论】:

    【解决方案2】:

    因为“未定义”的概念与 JavaScript 语言中定义的变量的状态不同。这样做的原因是可以理解的,但效果可能会令人困惑,尤其是在变量名与对象属性方面。

    您已经演示了如何尝试访问未定义的变量会引发异常。不要将此状态(未定义变量)与“未定义”类型混淆:

    if (bogusVariable) { // throws ReferenceError: bogusVariable is not defined.
    typeof(bogusVariable); // => undefined - wow, that's confusing.
    

    但是,可以安全地测试未定义对象的属性:

    var x = {}; // an object
    x.foo; // => undefined - since "x" has no property "foo".
    typeof(x.foo); // => undefined
    if (!x.foo) { /* true */ }
    

    您可以通过注意所有变量实际上是“全局”对象(网络浏览器中的“全局”或“窗口”)的属性来利用此属性。

    bogus; // => ReferenceError: bogus is not defined.
    global.bogus; // => undefined (on node/rhino)
    window.bogus; // => undefined (on web browsers)
    

    所以你也许可以这样写你的 EJS 代码:

    <% if (global.test) { %>
      <p><%= test %></p>
    <% } %>
    

    是的,这很令人困惑,JavaScript 语言的许多部分也是如此。

    【讨论】:

    • 感谢您提供如此详细的答案,我的问题实际上不在 JavaScript 中。 js很好,错误来自express内部,变量不存在。该变量在模板中很好,因此 express 的渲染函数正在转储该错误。谢谢!
    • 如果您的答案中的代码通过测试if(global.test) 对我不起作用,则使用最后一段。它总是抛出异常。我必须通过if( typeof( global.text) !== 'undefined') 进行检查。
    • 在ejs中,当你想使用一个可能没有定义的变量(这里是测试)时,你可以使用locals.test
    【解决方案3】:

    大多数语言都是这样的:

      irb
      >> foo
      NameError: undefined local variable or method `foo' for main:Object
            from (irb):1
    

    【讨论】:

    • 谢谢,我的问题实际上不在 JavaScript 中。 js很好,错误来自express内部,变量不存在。该变量在模板中很好,因此 express 的渲染函数正在转储该错误。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-06-16
    • 2016-06-06
    • 1970-01-01
    • 2022-06-19
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多