Meteor.methods在服务器端失败



我的目标是将设备令牌插入数据库。该方法在客户端成功,但在服务器端失败。我不知道为什么。

//lib/meteor_methods.js

Meteor.methods({
  savePushTokens: function(myToken) {
    console.log("Saving the token.")
    Tokens.insert({token: myToken}, function(error, result) {
        if (error) {
            console.log(error);
        }
        else {
            console.log(result);
        }
    });
    console.log("Token is now saved!");
  }
})

客户端/push_notifications.js

...
function tokenSuccessHandler(result) {
  console.log('token success result ' + result);
  window.localStorage.setItem('deviceToken', result);
  // API call to store token on your DB
  Meteor.call('savePushTokens', result)
  console.log(Tokens.find().fetch());
}
...

请看整个文件: https://github.com/mvaisanen/SimplePushApp/blob/pushplugin/client/push_notifications.js

Xcode 控制台输出

2015-01-22 10:27:51.165 myapp[33366:5680153] token success result 
077f2ea72eb6b2dfc381ce27f2eb12e2ee8ee68f7eeb90f7f2f10f1d99cd140e
2015-01-22 10:27:51.166 myapp[33366:5680153] Saving the token.
2015-01-22 10:27:51.166 myapp[33366:5680153] zp6vkrN5M4HtKF9NF
2015-01-22 10:27:51.166 myapp[33366:5680153] Token is now saved!
2015-01-22 10:27:51.166 myapp[33366:5680153] [{"token":"077f2ea72eb6b2dfc381ce27f2eb12e2ee8ee68f7eeb90f7f2f10f1d99cd140e","_id":"zp6vkrN5M4HtKF9NF"}]

一切似乎都很好。

但是,如果我在 meteor shell、客户端或服务器内部查询数据库,结果是空集合。(> Tokens.find().fetch() [])。

如果我在服务器端运行该方法,它实际上永远不会运行。见下文。

//lib/meteor_methods.js

Meteor.methods({
    savePushTokens: function(myToken) {
        console.log("Saving the token.")
        if (Meteor.isServer) {
                Tokens.insert({token: myToken}, function(error, result) {
                if (error) {
                    console.log(error);
                }
                else {
                    console.log(result);
                }
            });
            console.log("Token is now saved!");
        }
    }
});

Xcode 控制台输出

2015-01-22 10:32:59.290 myapp[33375:5681416] token success result 077f2ea72eb6b2dfc381ce27f2eb12e2ee8ee68f7eeb90f7f2f10f1d99cd140e
2015-01-22 10:32:59.291 myapp[33375:5681416] Saving the token.
2015-01-22 10:32:59.291 myapp[33375:5681416] []

知道吗?完整的存储库在这里 https://github.com/mvaisanen/SimplePushApp/tree/pushplugin

更新

我已经安装了autopublishinsecure

我用meteor run ios-device --mobile-server 192.168.1.6:3000启动应用程序。

我可以通过流星壳或流星蒙戈手动将数据插入数据库。

我还尝试检查meteor mongo中的令牌:

$ meteor mongo
MongoDB shell version: 2.4.12                 
connecting to: 127.0.0.1:3001/meteor
meteor:PRIMARY> db.tokens.find();
meteor:PRIMARY>

但我没有得到代币。

更新 2

我无法修复该错误。github(或其他地方)上是否有任何简单(或复杂)的Meteor应用程序具有Apple推送通知,我可以克隆它们,从而找到解决方案。

令牌很可能正在保存,但您查看它的方式使其看起来好像不是,因为它可能在您正在查看的位置不可见。

请记住:

  • Meteor 不会将所有数据发布到客户端,除非autopublish在您的项目中。
  • 如果在服务器上插入某些内容,则在将其发布到客户端的情况下,该内容不会立即在客户端上可用

您查找令牌的方式是在调用Meteor.call之后,此时不太可能在客户端上收到数据。

我不确定这是否会有任何区别,但你在服务器上使用异步 javascript。流星使用纤维,你不必这样做。

这很有帮助,如果有问题,流星会抛出错误。您可以简单地执行此操作:

if (Meteor.isServer) {
    Tokens.insert({token: myToken});
    console.log("Token is now saved!");
}

要检查令牌是否已插入,最好的方法是在应用程序运行时使用 meteor mongo 控制台并检查令牌是否在其中,这是数据库的实际 mongo shell,因此 meteor 的发布延迟/缺少发布方法可能不是问题。

meteor mongo
>db.tokens.find();

(如果您的集合称为"令牌",即:var PushTokens = new Mongo.Collection("tokens")

相关内容

最新更新