如何修改spark.js?我收到以下错误:Deps重新计算的异常:TypeError:无法读取null的属性'nodeName'

时间:2013-11-03 14:49:17

标签: meteor

更新:问题不在于火花 - 虽然我误解了发生的事情,因此问题形成得有些糟糕,但我要留下这个问题,万一它会让别人受益。

我收到以下错误:

Exception from Deps recompute: TypeError: Cannot read property 'nodeName' of null
at Patcher.match (http://localhost:3000/packages/spark.js?3a050592ceb34d6c585c70f1df11e353610be0ab:1540:12)

当我点击第二行的链接时,它会将我引导到spark.js的以下部分,其中错误是:

// Look at tags of parents until we hit parent of last-kept,                                   // 229
// which we know is ok.                                                                        // 230
for(var a=tgt.parentNode, b=src.parentNode;                                                    // 231
    a !== (starting ? this.tgtParent : lastKeptTgt.parentNode);                                // 232
    a = a.parentNode, b = b.parentNode) {                                                      // 233
  if (b === (starting ? this.srcParent : lastKeptSrc.parentNode))                              // 234
    return false; // src is shallower, b hit top first                                         // 235
  if (a.nodeName !== b.nodeName)                                                               // 236
    return false; // tag names don't match                                                     // 237
}          

违规行是这一行:if (a.nodeName !== b.nodeName)。我想调试这个...如何修改spark.js文件?我想将console.log(a)作为声明,并希望检查ab是否具有属性nodeName

StackOverflow上与此相关的问题是:

How to investigate "Exception form Deps recompute" what are the clues?

How can I modify the Meteor (meteorite) that is running?

第一个没有真正回答。第二个包括如何将程序包添加到meteor的建议,以便您可以修改它。但这对我不起作用 - 我的修改要么没有出现(如果我按照上面链接#2中的建议)或者生成错误,说流星找不到spark.js(如果我试图修改火花) .js文件位于〜/ .meteor /或我项目的.meteor /目录中的packages文件夹的客户端文件夹中。

对于我如何为我的流星项目修改spark.js文件(客户端版本),有人会有任何建议吗?

谢谢!

2013年11月9日更新:

我收到这些错误的原因是因为我试图将反向会话变量中的google地图geocoder.geocode()对象/方法的异步调用结果存储起来:

SessionAmplify = _.extend({}, Session, {
        keys: _.object(_.map(amplify.store(), function(value, key) {
        return [key, JSON.stringify(value)]
    })),
    set: function (key, value) {
        Session.set.apply(this, arguments);
        amplify.store(key, value);
    },
});

setLocation = function (e) {
    e.preventDefault;
    var address = e.target.value;
    geocoder = new google.maps.Geocoder();
    geocoder.geocode( { 'address': address}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {      
            map.setCenter(results[0].geometry.location);
            $('.found-address').html(results[0].formatted_address);

            SessionAmplify.set('pos', results[0].geometry.location);
            SessionAmplify.set('formatted_address', results[0].formatted_address);

        } else {
            alert('Geocode was not successful for the following reason: ' + status);
        }
    });
    return true;
};

问题行是SessionAmplify.set('pos', results[0].geometry.location);SessionAmplify.set('formatted_address', results[0].formatted_address);。似乎results变量没有及时到达我设置会话变量 - 这很奇怪,因为除非status变量到达,否则代码块不应该运行,我认为应该到达与results变量同时发生。

我查看了使用Meteor._wrapAsync()(我观看过的即时教程:https://www.eventedmind.com/feed/Ww3rQrHJo8FLgK7FF),但我无法弄清楚如何将Meteor._wrapAsync()geocoder.geocode()一起使用。一个问题是Meteor._wrapAsync()要求回调函数具有表单函数(错误,结果),但地理编码回调函数的格式为function(result, status)。有人建议吗?

2 个答案:

答案 0 :(得分:3)

好的,那不是Spark问题/异常。实际上,您的模板使用了一些未完全初始化的对象var。这是一个非常常见的错误。因此,在您的模板javascript文件中,您必须注意这些对象,并且在使用它们之前不必忘记检查它们是否可用:

if (_.contains(myObject, ['prop1', 'prop2])) {
    // your function template code here
}

流星应用程序中的另一点:通常当您的应用程序在客户端上加载时,您没有接收到所有数据(用户未按示例记录),但您的模板将呈现一次。然后,通过您的订阅,客户端将重新接收数据,您的模板将被重新呈现...

我希望它会对你有所帮助。

[编辑] 这是一个请求样本:

  // your npm async lib
  var stdRequest = Npm.require('request');
  // your anonymous func that wrap the async lib (you can do what you want here
  var requestGetAsync = function(url, options, cb) {
     stdRequest.get(url, options, function (err, response, body) {
        cb && cb(null, response);
     });
  };
  // the final wraping to make it sync
  requestGetSync = Meteor._wrapAsync(requestGetAsync);

如果您不想使用个人ano func自定义异步lib,您可以这样做:

  // the only wraping required
  requestGetSync = Meteor._wrapAsync(request);

要使用它,您只需要这样做:

  requestGetSync(/* standard params of original func */);

答案 1 :(得分:0)

该错误可能不在Spark中。当我在Meteor应用程序中添加新代码时,我经常遇到类似的错误。因此,如果我在控制台中看到此错误,我会尝试评论新代码并找到有问题的行,并尝试更改它。