2017-10-20 8 views
0

Je ne trouve aucun moyen de le faire dans les docs, et j'ai également regardé dans Stack Overflow. Je veux montrer à un utilisateur une vue limitée de ma réponse JSON de l'API, avant qu'ils ne se soient connectés.Obtention d'une réponse de limite à partir de Loopback, lorsqu'aucune authentification n'est fournie

Ainsi, à titre d'exemple, j'ai un e-book que je veux vendre en ligne. Je veux seulement qu'ils voient un lien d'aperçu (epubFile.notAuthoried) du livre quand non connecté, et le lien complet (epubFile.authorized) du livre une fois connecté. Les deux liens sont représentés dans la même table.

[ 
    { 
    "title": "string", 
    "subTitle": "string", 
    "isPublished": true, 
    "publicationDate": "2017-10-20T11:07:31.258Z", 
    "epubFile": { 
     "notAuthorized": "filename-noauth.epub" 
     "authorized": "filename-auth.epub" 
    } 
    "id": "string", 
    "createdOn": "2017-10-20T11:07:31.258Z", 
    "updatedOn": "2017-10-20T11:07:31.258Z" 
    } 
] 

Est-il même possible de filtrer les champs des points d'extrémité API dans le bouclage? Ou ai-je besoin de créer un nouveau point de terminaison API personnalisé?

Répondre

2

d'abord, vous devrez définir les autorisations sur vos méthodes find et findById à $ chacun afin que les deux autorisés et les utilisateurs non autorisés peuvent les appeler

{  
    "name": "eBook", 
    "base": "PersistedModel", 
    [...] 
    "acls": [ 
    "accessType": "READ", 
    "principalType": "ROLE", 
    "principalId": "$everyone", 
    "permission": "ALLOW", 
    "property":["find", "findById] 
    ] 
} 

Ensuite, vous devrez brancher dans la télécommande méthodes et modifier la réponse en fonction de si l'utilisateur hte est connecté ou non

const previewProperites = ['title', 'subTitle', etc...] 
Ebook.afterRemote('find', (ctx, ebooks, next) => { 
    // pseudo code 
    if(!ctx.options.accessToken){ 
    // no user logged in, only keep preview properties 
    ebooks.forEach(book => { 
     // get the properties of the book 
     var eBookProperties = Object.keys(book.__data); 

     eBookProperties.forEach(bookProp =>{ 
     if(!previewProperties.some(pProp => pProp === bookProp)){ 
      // ebook property not in preview list, so remove it 
      delete book.__data[bookProp]; // .__data is where loopback keeps its actual data 
     } 
     }); 
    }); 
    } 
    next(); 
} 
+0

Juste parce que je suis encore un peu novice dans bouclage, le crochet est placé dans les sous ebook.js modèles communs /, correct? Je vais essayer la solution proposée demain, merci @ YeeHaw1234 pour la réponse et merci pour les corrections grammaticales sur le texte halfer :) – NIKRI

+1

Vous pouvez mettre le code dans votre fichier ebook.js, mais nous avons constaté qu'il est plus facile de gardez le code propre si vous créez un dossier (/ common/models/ebook /), et créez un fichier .js pour chaque bit de fonctionnalité (/ebook/hidePropertiesForPreview.js). Ensuite, dans votre fichier ebook.js, exigez ce nouveau fichier .js et appelez-le – YeeHaw1234