是否可以在流星集合更新/删除中使用变量?

时间:2014-07-28 16:47:54

标签: meteor

所以我正在考虑以下列方式重构我的代码。

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);
} 

3 个答案:

答案 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();
    }
}