2016-07-09 6 views
0

Arbeit habe ich diesen Code auf meinem Meteor App:Meteor.call und Servermethoden nicht richtig

// client side 
Template.lead.events({ 
    'submit .insertExternalAccountForm': function (event) { 
     event.preventDefault(); 
     Session.set('mcsStatus', 'Creating external account ...'); 

     var target = { 
      code: event.target.code.value, 
      leadId: event.target.leadId.value, 
      name: event.target.name.value, 
      username: event.target.username.value, 
      password: event.target.password.value, 
      searchSourceId: event.target.searchSourceId.value, 
      clientId: event.target.clientId.value, 
      clientUserId: event.target.clientUserId.value 
     }; 

     var noFormError = true; 
     if (target.username.length === 0) { 
      Session.set("username_error", "Field must not be empty"); 
      noFormError = false; 
     } else { 
      Session.set("username_error", null); 
     } 

     if (target.password.length === 0) { 
      Session.set("password_error", "password must not be empty"); 
      noFormError = false; 
     } else { 
      Session.set("password_error", null); 
     } 

     if (!noFormError) { 
      return noFormError; 
     } 

     Meteor.call('createExternalAccount', target, function (err, res) { 
      if (err) { 
       console.error(err); 
      } 
      console.log('in meteor call'); 
      Router.go('/' + res.domain + '/' + res.externalId); 
     }); 
    } 
}); 

//server side 

var createExternalAccountSync = function (query, external) { 
    return models.SearchSources.findOne(query).exec() 
    .then(function (searchsource) { 
     external.domain = searchsource.source; 
     var emr = searchsource.source.split('-'); 
     return models.Organization.findOne({externalId: emr[2]}).exec(); 
    }).then(function (org) { 
     console.log('after org'); 
     external.organizationId = org._id; 
     return models.AppUser.findOne({clientId: external.clientId, externalId: external.clientUserId }).exec(); 
    }).then(function (user) { 
     console.log('after app user'); 
     external.userId = user._id; 
     external.userIds = [user._id]; 
     return new Promise(function (resolve,reject) { 
      console.log('saveOrUpdate'); 
      models.ExternalAccount.saveOrUpdate(external, function (err, newE) { 
       if (err) { 
        console.error(err) 
        reject(err); 
       } 
       resolve(newE) 
      }); 
     }); 
    }) 
    .catch(function (e) { 
     console.error(e); 
     throw new Meteor.Error(e); 
    }); 
}; 


Meteor.methods({'createExternalAccount': function (data) { 
     var query = {}; 
     var newExternalAccount = new models.ExternalAccount(); 

     newExternalAccount.username = data.username; 
     newExternalAccount.password = data.password; 
     newExternalAccount.externalId = data.username; 
     newExternalAccount.name = data.name; 
     newExternalAccount.clientId = data.clientId; 
     newExternalAccount.clientUserId = data.clientUserId; 
     newExternalAccount._metadata = { leadId: data.leadId }; 
     if (data.code === 'f') { 
      query.searchSourceId = '5744f0925db77e3e42136924'; 
     } else { 
      query.searchSourceId = data.searchSourceId; 
     } 

     newExternalAccount.searchSourceId = query.searchSourceId; 
     console.log('creating external account') 
     createExternalAccountSync(query, newExternalAccount) 
     .then(function (external) { 
      console.log('should return to meteor call'); 
      return external; 
     }) 
     .catch(function (e) { 
      console.error(e); 
      throw new Meteor.Error(e); 
     }); 
    } 
}); 

Das Problem, das ich habe, ist, dass der Code auf der Serverseite, während es richtig genannt wird, löst nicht die clientseitige meteor.call aus, es gibt keine console.log-Ausgabe oder irgendetwas. Ich glaube, dass die Meteor.wrapAsync-Methode richtig verwendet wird, aber immer noch nichts auf der Client-Seite zeigt, und nicht in der Tat umzuleiten, wo ich möchte, dass der Benutzer nach dem Senden des Formulars geht.

UPDATE

Der Code auf die neueste Form aktualisiert wird, aber jetzt einen seltsamen Fehler auf dem Client erhalte ich, und es ist eigentlich, weil die meteor.call Methode auf der Vorlage gibt weder Fehler oder Ergebnis

Exception in delivering result of invoking 'createExternalAccount': http://localhost:3000/app/app.js?hash=c61e16cef6474ef12f0289b3f8662d8a83a184ab:540:40 
http://localhost:3000/packages/meteor.js?hash=ae8b8affa9680bf9720bd8f7fa112f13a62f71c3:1105:27 
[email protected]://localhost:3000/packages/ddp-client.js?hash=27502404fad7fc072e57e8b0b6719f40d92709c7:3557:21 
[email protected]://localhost:3000/packages/ddp-client.js?hash=27502404fad7fc072e57e8b0b6719f40d92709c7:3577:30 
[email protected]://localhost:3000/packages/ddp-client.js?hash=27502404fad7fc072e57e8b0b6719f40d92709c7:4742:22 
[email protected]://localhost:3000/packages/ddp-client.js?hash=27502404fad7fc072e57e8b0b6719f40d92709c7:3385:28 
http://localhost:3000/packages/ddp-client.js?hash=27502404fad7fc072e57e8b0b6719f40d92709c7:2736:19 
[email protected][native code] 
[email protected]://localhost:3000/packages/underscore.js?hash=27b3d669b418de8577518760446467e6ff429b1e:149:18 
[email protected]://localhost:3000/packages/ddp-client.js?hash=27502404fad7fc072e57e8b0b6719f40d92709c7:2735:15 
[email protected]://localhost:3000/packages/ddp-client.js?hash=27502404fad7fc072e57e8b0b6719f40d92709c7:175:27 
[email protected]://localhost:3000/packages/ddp-client.js?hash=27502404fad7fc072e57e8b0b6719f40d92709c7:1160:23 
[email protected]://localhost:3000/packages/ddp-client.js?hash=27502404fad7fc072e57e8b0b6719f40d92709c7:1218:34 
[email protected]://localhost:3000/packages/ddp-client.js?hash=27502404fad7fc072e57e8b0b6719f40d92709c7:1365:28 
+0

Kleine Erinnerung rufen: Wir brauchen Code zu erscheinen _in_ Fragen hier - Links zu Pappen auf eigene Faust können die Post dazu führen, gekennzeichnet zu werden als off- Thema. – halfer

+0

Nicht sicher, warum Sie ['findOne()'] (http://docs.meteor.com/api/collections.html#Mongo-Collection-findOne) überhaupt als Async-Funktion verwenden? – ghybs

+0

@halfer Entschuldigung, dass ich die Frage aktualisieren werde, scheinen die Code zu groß um ehrlich zu sein – maumercado

Antwort

0

Durch den Code, den Sie zur Verfügung gestellt haben, könnte es sein, weil Sie andere Methode aufrufen.

Sie definiert ‚create‘ aber auf Client-Seite Sie ‚createExternalAccount‘

+0

Ja, das ist in Ordnung, ich habe tatsächlich die Namen einiger Methoden geändert und wahrscheinlich vergessen :) sorry – maumercado

+0

@maumercado: Bitte aktualisieren Sie Ihr Code Beispiel auf den neuesten Code, so dass neue Leser nicht zu der gleichen Schlussfolgerung kommen. Vielen Dank. – halfer