2014-11-14 5 views
7

Wie kann ich auf die Details des Benutzers, der die Anforderung von einem Modell HakenZugang Request-Header von before Modell Haken

Comment.beforeSave = function(next,com) { 
//Want to add 2 more properties before saving 
com.added_at = new Date();  
com.added_by = //How can i set the user id here ?? 
//In case of a Remote hook i have ctx in param and i can get user id like this  ctx.req.accessToken.userId; But in Model Hook how can i do the same?  
next();  
}; 

Gibt es eine Möglichkeit, dies zu tun zu erhöhen? Ich habe versucht mit Remote-Haken für die wichtigsten Artikel in der Art und Weise

MainItem.beforeRemote('**', function(ctx, user, next) { 
if(ctx.methodString == 'leave_request.prototype.__create__comments'){  
    ctx.req.body.added_by = ctx.req.accessToken.userId;  
    ctx.req.body.added_at = new Date();       
    console.log("Added headers as .."+ctx.req.body.added_by); 
}  
else{ 
    ctx.req.body.requested_at = new Date(); 
    ctx.req.body.requested_by = ctx.req.accessToken.userId; 
    console.log("Added header @ else as .."+ctx.req.body.requested_by); 
} 
next(); 

});

und ich erhalte die Konsolenprotokolle richtig, wenn ich Anfrage aus dem Explorer, aber Aber der Explorer zurückkehren mir immer den Fehler

„Fehler“: { „name“: „Validation“, „Status“: 422, "message": "Die comment Instanz ist nicht gültig Details: added_by darf nicht leer sein; added_at kann nicht leer sein..", "status": 422, "Details": { "Kontext" : "Kommentar", "Codes": { "added_by": [ "Präsenz" ], "added_at": [ "Präsenz" ] }, "Nachrichten": { "added_by": [ "nicht leer sein"], "added_at": [ „kann 't be blank " ] } }, " Stapel ":" ValidationError: Die comment Instanz ist nicht gültig. Details: added_by kann nicht leer sein; added_at kann nicht leer sein. \ N " } }

und mein Modell ist wie

"properties": { 
"body": { 
    "type": "string", 
    "required": true 
}, 
"added_by": { 
    "type": "number", 
    "required": true 
}, 
"added_at": { 
    "type": "date", 
    "required": true 
}, 
"leave_request_id":{ 
    "type": "number", 
    "required": true 
} 

}

Antwort

9

Es scheint, dass Sie verwandte Modell mit einfach überschreiben ctx.req.body nicht aktualisieren können. Anstelle von sollten Sie überschreiben ctx.args.data - es sieht aus wie dieser ctx-Parameter verwendet wird, um das verwandte Modell zu initialisieren.

So wird es so aussehen:

MainItem.beforeRemote('**', function(ctx, user, next) { 
    if(ctx.methodString == 'leave_request.prototype.__create__comments'){ 
    ctx.args.data.added_by = ctx.req.accessToken.userId;  
    ctx.args.data.added_at = new Date();       
    console.log("Added headers as .."+ctx.args.data.added_by); 
    }  
    else{ ... } 
    next(); 
2

Die beforeRemote Haken ausgeführt werden, bevor der Modellhaken, so können Sie die Benutzer-ID hinzufügen auf die Anfrage Körper.

Comment.beforeRemote('**', function (ctx, unused, next) { 
    var userId = ctx.req.accessToken.userId; 
    if (ctx.methodString == 'Comment.create' || ctx.methodString == 'Comment.updateAttributes') { 
     ctx.req.body.userId = userId; 
    } 
    next(); 
}); 

möchten Sie vielleicht welche methodstring zusagt am besten überprüfen.

+0

Mein Kommentar-Modell wird nicht direkt an API ausgegeben. Also beforeRemote wird nicht dafür ausgeführt. Mein Endpunkt ist MainItem//Kommentar. So beforeRemote wird nur für MainItem ausgeführt –

+0

In diesem Fall müssten Sie den Hook Ihres MainItem-Modells festlegen und versuchen, die userId in einer globalen oder in den Kommentareinstellungen zu speichern. Dies ist nicht optimal und könnte zu Fehlern bei gleichzeitigen Anfragen führen. Entschuldigen Sie. – amenadiel

+0

ich editted frage jetzt, können Sie jetzt helfen? –

1

Mit dem gleichen Problem konfrontiert, verwendete ich Knoten expiremantal domain Feature (das für die Fehlerbehandlung vorgesehen).

Speichern eingehenden Request-Objekt:

// -- Your pre-processing middleware here -- 
app.use(function (req, res, next) { 
    // create per request domain instance 
    var domain = require('domain').create(); 

    // save request to domain, to make it accessible everywhere 
    domain.req = req; 
    domain.run(next); 
}); 

Weiter innen Modell Haken Sie Zugang zu erf Objekt haben, die für jede Verbindung erstellt wird:

process.domain.req 

Auch StrongLoop Team context propagation hinzugefügt (basierend auf continuation-local-storage), aber es ist noch nicht dokumentiert.

0

Wenn wir davon ausgehen, dass es eine Beziehung Kommentare von Benutzer -> Kommentar, können Sie auch Relation Methode POST /users/{user_id}/comments versuchen, die die foreignId bevölkern (die added_by sein kann).Eine andere Sache ist added_at. Soweit ich weiß, wird der Validierung-Hook vor dem Erstellen des Hooks ausgelöst. Dies bedeutet, dass die Validierung fehlschlägt, da dieses Feld in einem Modell als erforderlich markiert ist. Die Frage ist, ob dieses Feld als erforderlich markiert werden soll, da es vom Server gesetzt wird und nicht vom Client der API gesetzt werden muss.

1

Ich löste dies durch die Middleware für Körper Parsing hinzufügen. In den middleware.js ich den folgenden Code geschrieben:

... 
"parse": { 
    "body-parser#json": {}, 
    "body-parser#urlencoded": {"params": { "extended": true }} 
}, 
... 

Auch in den server.js habe ich die erforderlich für den Körper Parser und multer:

var loopback = require('loopback'); 
... 
var bodyParser = require('body-parser'); 
var multer = require('multer'); 
... 

app.use(bodyParser.json()); // application/json 
app.use(bodyParser.urlencoded({ extended: true })); // application/x-www-form-urlencoded 
app.use(multer()); // multipart/form-data 
... 

dann die Abhängigkeiten im Paket hinzufügen .json

"body-parser": "^1.12.4", 
"multer": "^0.1.8" 

Jetzt können Sie Dinge wie die folgenden in den /models/user.js tun (für jedes Modell)

user.beforeRemote('create', function(ctx, unused, next) { 
    console.log("The registered user is: " + ctx.req.body.email); 
    next(); 
    }); 

Ich hoffe, das hilft! :)