更新:问题不在于火花 - 虽然我误解了发生的事情,因此问题形成得有些糟糕,但我要留下这个问题,万一它会让别人受益。
我收到以下错误:
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)
作为声明,并希望检查a
或b
是否具有属性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)
。有人建议吗?
答案 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应用程序中添加新代码时,我经常遇到类似的错误。因此,如果我在控制台中看到此错误,我会尝试评论新代码并找到有问题的行,并尝试更改它。