2017-10-02 2 views
0

J'utilise Loopback pour mon serveur api backend à ma base de données et Meteor pour le frontend. Dans Meteor, j'utilise Axios pour appeler l'API. Je voulais utiliser Meteor.call pour pouvoir gérer toutes les fonctions d'appels api connexes dans le même fichier pour une gestion plus facile, par ex. facture obtenir, ajouter, modifier, supprimer tous dans le fichier de la facture, etcL'appel Meteor à l'API a abouti à des entrées doubles

Si je devais appeler l'Axios à poster à l'API directement sur le formulaire soumettre, l'enregistrement dans ma base de données montre un seul enregistrement inséré (qui est ce que devrait). Mais si je devais appeler l'Axios à partir d'un Meteor.call, la base de données aurait deux entrées du même contexte.

Je ne comprends pas très bien pourquoi ou d'où vient la double entrée. Quelqu'un pourrait-il expliquer?

Merci.

Mon Meteor appel de méthode pour api pour insérer une nouvelle textContext:

Meteor.methods({ 
    'textContext.insert': function(myText, token) { 
     new SimpleSchema({ 
      myText: { 
       type: String, 
       min: 1 
      }, 
      token: { 
       type: String, 
       label: 'Authorization', 
       min: 1 
      } 
     }).validate({myText, token}); 

     const jsonToken = JSON.parse(token); 
     const url = `http://localhost:3001/v1/users/${jsonToken.userId}/textContexts`; 
     const data = { 
      text_context: myText, 
      user_id: jsonToken.userId 
     }; 

     return axios({ 
      method: 'post', 
      url, 
      headers: {'Authorization': jsonToken.token}, 
      data 
     }) 
     .then(res => { 
      console.log(res.data); 
      return res.data; 
     }) 
     .catch((err) => { 
      if (err instanceof Error) { 
       console.log('Error:', err.message); 
      } 
     }); 
    } 
}); 

TextContext Modèle Loopback, texte context.json, étendu de textContextBasic qui contient seulement created_at:

{ 
    "name": "textContext", 
    "base": "textContextBasic", 
    "idInjection": true, 
    "options": { 
    "validateUpsert": true 
    }, 
    "properties": { 
    "text_context": { 
     "type": "string" 
    } 
    }, 
    "validations": [], 
    "relations": { 
    "user": { 
     "type": "belongsTo", 
     "model": "user", 
     "foreignKey": "user_id" 
    } 
    }, 
    "acls": [ 
    { 
     "principalType": "ROLE", 
     "principalId": "$everyone", 
     "permission": "DENY" 
    }, 
    { 
     "accessType": "EXECUTE", 
     "principalType": "ROLE", 
     "principalId": "$authenticated", 
     "permission": "ALLOW", 
     "property": "create" 
    }, 
    { 
     "accessType": "EXECUTE", 
     "principalType": "ROLE", 
     "principalId": "$authenticated", 
     "permission": "ALLOW", 
     "property": "createOrReplace" 
    }, 
    { 
     "accessType": "EXECUTE", 
     "principalType": "ROLE", 
     "principalId": "$owner", 
     "permission": "ALLOW", 
     "property": "findById" 
    }, 
    { 
     "accessType": "READ", 
     "principalType": "ROLE", 
     "principalId": "$owner", 
     "permission": "ALLOW", 
     "property": "findOne" 
    }, 
    { 
     "accessType": "EXECUTE", 
     "principalType": "ROLE", 
     "principalId": "$owner", 
     "permission": "ALLOW", 
     "property": "find" 
    } 
    ], 
    "methods": {} 
} 

Modèle User.json dans le Loopback:

{ 
    "name": "user", 
    "base": "User", 
    "idInjection": true, 
    "options": { 
    "validateUpsert": true 
    }, 
    "properties": { 
    "created_at": { 
     "type": "date", 
     "required": true, 
     "default": "$now" 
    }, 
    "updated_at": { 
     "type": "date", 
     "required": true, 
     "default": "$now" 
    } 
    }, 
    "validations": [], 
    "relations": { 
    "textContexts": { 
     "type": "hasMany", 
     "model": "textContext", 
     "foreignKey": "user_id" 
    } 
    }, 
    "acls": [ 
    { 
     "accessType": "*", 
     "principalType": "ROLE", 
     "principalId": "$everyone", 
     "permission": "DENY" 
    }, 
    { 
     "accessType": "*", 
     "principalType": "ROLE", 
     "principalId": "admin", 
     "permission": "ALLOW" 
    }, 
    { 
     "principalType": "ROLE", 
     "principalId": "$owner", 
     "permission": "ALLOW", 
     "property": "__get__textContext" 
    }, 
    { 
     "principalType": "ROLE", 
     "principalId": "$owner", 
     "permission": "ALLOW", 
     "property": "__create__textContext" 
    }, 
    { 
     "principalType": "ROLE", 
     "principalId": "$owner", 
     "permission": "ALLOW", 
     "property": "__findById__textContext" 
    }, 
    { 
     "principalType": "ROLE", 
     "principalId": "$owner", 
     "permission": "ALLOW", 
     "property": "__updateById__textContext" 
    } 
    ], 
    "methods": {} 
} 
+0

Et où est le code API? – Styx

+0

Je n'ai pas écrit de code API car il est généré à partir de Loopback, j'ai seulement défini le modèle, ajouté le modèle textContext. Quand je l'ai testé avec express.js, l'API fonctionne correctement, donc ça a fonctionné correctement quand j'ai testé avec l'explorateur fourni avec Loopback. –

+0

Lorsque j'ai fait la requête de poste avec axios de Meteor directement lors de la soumission du formulaire, l'insertion textContext est correctement effectuée avec 1 enregistrement, mais pas lorsqu'elle est effectuée via l'appel Meteor à la même demande de poste, elle génère 2 enregistrements. Je ne pense pas que ce soit un problème avec l'API. –

Répondre

0

Enfin trouvé la source de le problème, il devra être inclus dans (Meteor.isServer) car il est dans le client.