boomerang-express
boomerang-express copied to clipboard
TypeError: restiming.forEach is not a function
Following error occured:
TypeError: restiming.forEach is not a function
at Boomerang.restiming (/home/my/boomerang-express/lib/boomerang/index.js:99:13)
at null.<anonymous> (/home/my/boomerang-express/lib/boomerang/index.js:83:18)
at Backend.<anonymous> (/home/my/boomerang-express/lib/datastore/nedb/index.js:80:7)
at callback (/home/my/boomerang-express/node_modules/nedb/lib/executor.js:30:17)
at /home/my/boomerang-express/node_modules/nedb/lib/datastore.js:288:12
at /home/my/boomerang-express/node_modules/nedb/lib/persistence.js:209:12
at FSReqWrap.oncomplete (fs.js:82:15)
error: Forever detected script exited with code: 0
This is the corresponding code block:
Boomerang.prototype.restiming = function(oid, restiming, user, collection) {
restiming.forEach(function(timing) {
timing.refer = oid;
this.store("resource", user, collection, this.filter.inflate(timing), function() { });
}, this);
};
If I debug this restiming variable, it is a string (not an array) with the following content:
{
"http":{
"://localhost:4001/":{
"|":"6,dz,dx,8u,8u,,f,f,f*117y,95",
"boomerang/":{
"boomerang.js":"3e5,v,r,c*116x3,95*20",
"plugins/":{
"r":{
"t.js":"3e5,y,x,g*1r7f,95*20",
"estiming.js":"3e5,1b,18,y*1up9,95*20"
},
"navtiming.js":"3e5,14,12,v*15fs,94*20"
}
}
},
"s://www.mydomain.de/testpic.png":"*013,32,8,8|1e6"
}
}
What do I have to do?
This is a shortcoming of boomerang-express as it doesn't support trie compression used in newer versions of Boomerang. You could have a look at https://github.com/nicjansma/resourcetiming-compression.js and see if you could implement it here for newer versions of boomerang.
Ah, thanks, works like a charm. npm install resourcetiming-compression and edited the file lib/boomerang/index.js: Around line 80:
this.store(beacon.type, beacon.user, beacon.collection, data, function(oid) {
if (typeof restiming !== "undefined") {
var ResourceTimingDecompression = require("resourcetiming-compression").ResourceTimingDecompression;
restiming = ResourceTimingDecompression.decompressResources(JSON.parse(restiming));
this.restiming(oid, restiming, beacon.user, beacon.collection);
}
}.bind(this));
@pzystorm If you can wrap this in a try/catch and check for older versions that do not use compression I'd be happy to take it as a contribution :)