所以我正在考虑以下列方式重构我的代码。
Meteor.call("RemoveNotification", this._id, function(error, response){
}
和
Meteor.call("RemoveAvailablePlayer", this._id, function(error, response){
}
到
Meteor.call("RemoveFromDatabase", "Notifications", this_id, function(error, response){
}
和
Meteor.call("RemoveFromDatabase", "AvailablePlayers", this_id, function(error, response){
}
这样只需要一个流星方法来处理对任何集合的删除。 这可能吗?当我尝试以下Meteor方法时,它对我不起作用。
RemoveFromDatabase : function(collection, id){
collection.remove(id);
}
答案 0 :(得分:0)
是的,有可能:在javascript中你需要使用方括号表示法来获取一个使用字符串变量的对象,这意味着你需要从它的父变量开始。在服务器上,与Node.js中的其他地方一样,全局对象只是global
(在客户端上它将是window
)。所以:
global[collection].remove(id);
应该这样做,只要您引用有效的集合(可以通过查看collection in global
是否返回true
来查看)。
答案 1 :(得分:0)
以下是RemoveFromDatabase
的工作实现,可以在客户端和服务器之间共享:
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');
}
}
});
一般情况下,我强烈提醒您不要使用此技术,因为它允许任何人从任何集合中删除任何文档,因为服务器端代码不会通过允许/拒绝方法运行。避免这些类型的安全漏洞是人们首先实现每个集合删除方法的原因。至少,您可能想要检查用户是否已登录,或者collectionName
是否在某个可接受的子集中。
答案 2 :(得分:0)
我尝试了一些复杂的方法,但随后找到了简单方法 - 使用dburles:mongo-collection-instances包 - https://atmospherejs.com/dburles/mongo-collection-instances 它允许通过变量中的集合名称访问任何集合:
import java.awt.*;
import java.awt.event.*;
import java.util.Date;
import java.lang.Thread;
public class TimeInSeconds extends Frame implements Runnable
{
private Label lblOne;
private Date dd;
private Thread th;
public TimeInSeconds()
{
setTitle("Current time");
setSize(200,150);
setVisible(true);
setLayout(new FlowLayout());
addWindowListener(new WindowAdapter() {
public void windowClose(WindowEvent we){
System.exit(0);
}
});
lblOne = new Label("00:00:00");
add(lblOne);
th = new Thread(this);
th.start(); // here thread starts
}
public void run()
{
try
{
do
{
dd = new Date();
lblOne.setText(dd.getHours() + " : " + dd.getMinutes() + " : " + dd.getSeconds());
Thread.sleep(1000); // 1000 = 1 second
}while(th.isAlive());
}
catch(Exception e)
{
}
}
public static void main(String[] args)
{
new TimeInSeconds();
}
}