2015-01-22 3 views
0

Моя цель - вставить маркер устройства в db. Метод успешно выполняется на клиенте, но сбой на стороне сервера. Понятия не имею почему.Ошибка Meteor.methods на стороне сервера

// Библиотека/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"}] 

Все кажется прекрасным.

Однако, если я запрашиваю базу данных внутри оболочки метеора, клиента или сервера, результатом является пустая коллекция. (> Tokens.find().fetch() []).

Если я запускаю метод на стороне сервера, он на самом деле никогда не запускается. Смотри ниже.

// Библиотека/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

UPDATE

У меня есть autopublish и insecure установлен.

Я запускаю приложение с meteor run ios-device --mobile-server 192.168.1.6:3000.

Я могу вручную вставлять данные в db через раковину метеора или метеоритный монго.

Я также попытался проверить на жетоны в 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> 

Но я не получаю лексемы.

UPDATE 2

я не смог исправить ошибку. Существуют ли какие-либо простые (или сложные) приложения Meteor на github (или где-то еще), которые имеют Apple push-уведомления и которые я мог бы клонировать и таким образом находить решения.

+0

Основной вопрос ... у вас есть «небезопасные» и «autopublish» пакеты установлены/удалены Если они будут удалены вам нужно? публиковать и подписываться на данные и иметь доступ на запись к коллекции. Сейчас вы успешно пишете клиенту minimongo. – benstr

+0

Установлены как «небезопасные», так и «автоматические публикации». У меня действительно базовое приложение с push-уведомлениями. могу ли я получать push-уведомления, работающие. – Mika

+0

У вас есть 'aldeed: simpleschema' или' aldeed: collection2' установлен? – richsilv

ответ

0

Его вполне вероятно, что токен является, но способ, которым вы смотрите на него, заставляет его выглядеть так, как будто его нет, потому что он может быть не виден в тех местах, где вы смотрите на то, как он выглядит в.

Имейте в виду, что:

  • Meteor не публикует все данные клиента, если autopublish не в свой проект.
  • Если вставить что-то на сервере, не сразу доступен на клиенте, в том случае, если он будет опубликован клиентом

таким образом, что вы ищете лексемы правильно после вызова Meteor.call , вряд ли данные будут получены на клиенте на данный момент.

Я не уверен, будет ли это иметь какое-либо значение, но вы используете асинхронный javascript на сервере. Метеор использует волокна, и вам не нужно это делать.

Это полезно, если есть проблема, метеорит вызовет ошибку. Вы можете просто сделать это:

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

Чтобы проверить, был ли вставлен маркер, лучший способ заключается в использовании консоли meteor mongo в то время как ваше приложение работает и проверьте маркеры находятся там, это фактическая Монго shell в базу данных, поэтому публикация о задержке публикации/отсутствии публикации в метеоре, вероятно, не будет проблемой.

meteor mongo 
>db.tokens.find(); 

(Если ваша коллекция называется «жетоны», то есть:. var PushTokens = new Mongo.Collection("tokens")

+0

Если я проверяю токены в метеорном манго, он ничего не возвращает. Является ли папка lib правильным местом для размещения методов? Должен ли я использовать Meteor.isServer с помощью методов или нет? Ни один из способов не работает в данный момент. – Mika

Смежные вопросы