So I was thinking about refactoring my code in the following way.
Meteor.call(\"RemoveNotification\", this._id, function(error, response){
}
an
Yes it is possible: in javascript you need to use square bracket notation to get an object using a string variable, which means you need to work down from its parent. On the server, as elsewhere in Node.js, the global object is just global
(it would be window
on the client). So:
global[collection].remove(id);
should do it, provided you're referring to a valid collection (which you can check by seeing if collection in global
returns true
).
I tried these a bit complex ways but then find the easies way - using the dburles:mongo-collection-instances package - https://atmospherejs.com/dburles/mongo-collection-instances It let's to access any collection by the collection name in variable:
let collName = "blabla";
Mongo.Collection.get(collName).find() // ... or any else
Here is a working implementation of RemoveFromDatabase
that can be shared between the client and the server:
Meteor.methods({
RemoveFromDatabase: function(collectionName, id) {
check(collectionName, String);
check(id, String);
var globalObject = Meteor.isServer ? global : window;
var collection = globalObject[collectionName];
if (collection instanceof Meteor.Collection) {
return collection.remove(id);
} else {
throw new Meteor.Error(404, 'Cannot find the collection');
}
}
});
In general I'd strongly caution you against using this technique, because it allows literally anyone to remove any document from any collection as server-side code does not run though allow/deny methods. Avoiding these kinds of security holes are why people implement per-collection remove methods in the first place. At a minimum, you may want to check that the user is logged in, or that collectionName
is in some acceptable subset.