【问题标题】:What is behind this node scope error?这个节点范围错误的背后是什么?
【发布时间】:2015-03-28 23:48:30
【问题描述】:

这里有一个我正在处理的节点模块。以前它只是许多嵌套函数。我想改进代码,所以把所有的函数都写出来,然后在底部按顺序调用它们。发生了一件奇怪的事情,我没有得到TypeError: Cannot read property 'url' of undefined

var User = require( '../models/userModel' ),
    ...

exports.add = function ( req, res ) {

    function getVideoId ( req, callback ) {
        videoId = URL.parse( req.query.url ).query.slice(-11)
        callback( videoId )
    }

    ...


    getVideoId( req, function() {
        ...
            ...
                ...
                    ...
                        ...

                            return res.json( "Done." )
                        })
                    })
                })
            })
        })
    })
}

【问题讨论】:

  • 也许你应该看看 promises 而不是回调地狱?
  • 我和@adeneo 一起讨论这个问题。如果这是异步代码,您真的想使用Promises。您在这里拥有的是那些“末日金字塔”反模式之一。有关开箱即用的 ES6 标准的更多信息,请通过 iojs 获得,可通过永远有用的 Mozilla MDN 获得。
  • @adeneo 是的,我已经开始这样做了。昨晚起床编写此代码的第三个版本,但没有按照描述的那样工作。一次一件事。
  • 这里需要做一些基本的调试。当getVideoId 调用时,req 填充了什么?还值得注意的是,在函数中声明然后立即调用函数是一种有点可疑的优化。您可能希望首先声明您的函数,在其外部,然后在您要导出的最终函数中使用它们。
  • @tadman 回复:在导出之外声明函数;是的,我这样做了,但将它们移入以尝试解决此范围问题。当我执行console.log( req.query ) 时,我看到一个带有url: 'my-url 的json 对象。

标签: javascript node.js scope request


【解决方案1】:

当您取消嵌套函数时,您的范围发生了变化。由于您在另一个函数中声明了一个函数,因此范围得到了维护。因此,在嵌套函数 3 中,您可以使用嵌套函数 1 和 2 的所有值!

【讨论】:

  • 我不认为这是问题的根源。 req 仍在范围内,这是未定义的 reqquery 属性。如果是范围错误,req 将不会被定义。
  • 我很难从原始问题中说出代码流。就像哪一行有错误,以及那一行的上下文。也许url 属性位于不同的未定义变量上?我同意你的观点,但如果从“工作”变为“不工作”的唯一事情是代码重新格式化,我仍然认为 that 错误的可能罪魁祸首是正在使用的函数在与以前不同的范围内。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 2021-12-13
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多