2015-02-06 4 views
5

Angenommen, ich habe dieses Modell:Wie auf Request-Objekt in sails.js Lifecycle-Callbacks zugreifen?

module.exports = { 

    attributes: { 

    title: { 
     type: 'string', 
     required: true 
    }, 

    content: { 
     type: 'string', 
     required: true 
    }, 

    createdBy: { 
     type: 'string', 
     required: true 
    } 
    } 
} 

ich den aktuellen Benutzer-ID des Modells createdBy Attribut festlegen müssen. Ich dachte, ich könnte das mit dem Rückruf vor dem Rückruf von Lebensdaten tun, aber ich kann nicht auf das Anfrageobjekt zugreifen, in dem der aktuelle Benutzer gespeichert ist. Gibt es einen Weg, um darauf zuzugreifen, oder sollte ich das irgendwie anders lösen?

Ich habe versucht, dies ohne Erfolg:

beforeValidate: function (values, next) { 
    var req = this.req; // this is undefined 
    values.createdBy = req.user.id; 
    next(); 
} 

Antwort

7

Da Anfragen außerhalb des Anwendungsbereichs des ORM sind, wie ich vermutete, mein Ansatz falsch war, und dass ich brauchte die createdBy Daten hinzufügen auf den req.body innerhalb einer Middleware. Aber da dies nicht für jede Anfrage getan werden muss, würde ich mir denken, dass es besser wäre, dies mit einer Richtlinie zu tun. Gefällt mir:

PostController: { 

    '*': ['passport', 'sessionAuth'], 

    create: ['passport', 'sessionAuth', 
    function (req, res, next) { 
     if (typeof req.body.createdBy === 'undefined') { 
     req.body.createdBy = req.user.id; 
     } 
     next(); 
    } 
    ] 
} 

Auf diese Weise muss ich den Blueprint nicht überschreiben.

+1

Ich bin überrascht, dass mehr Leute das nicht empfehlen. Es ist immer ein Anti-Pattern, um Ziele zu erstellen. Richtlinien machen das viel einfacher. –

+0

Ok, aber wie kann ich dank dieser Richtlinie auf req Inside Lifecycle Callback zugreifen? – pie6k

+0

Super! Das hat mein Problem gelöst! –

1

Sie es auf zwei Arten tun können.

Zuerst ist es, diese Daten im Controller hinzuzufügen. So etwas wie

// /api/controllers/mycontroller.js 
module.exports = { 
    new: function(req, res) { 
     if (typeof req.user.id !== 'undefined') { 
      req.body.createdBy = req.user.id;  // req.body or req.params 
     } 
     MyModel.create(req.body /* ... */) 
    } 
} 

Wenn Sie eine Menge von Datenmanipulation mit MyModel haben könnte es ärgerlich sein. Sie können also Ihrem Modell eine statische Methode hinzufügen, um sie mit der Benutzer-ID zu speichern. Etwas wie:

// /api/models/myModel.js 
module.exports = { 
    attributes: {/* ... */}, 

    createFromRequest: function(req, cb) { 
     // do anything you want with your request 
     // for example add user id to req.body 
     if (typeof req.user.id !== 'undefined') { 
      req.body.createdBy = req.user.id; 
     } 
     MyModel.create(req.body, cb); 
    } 
} 

und die Verwendung es in Ihrem Controller

// /api/controllers/mycontroller.js 
module.exports = { 
    new: function(req, res) { 
     MyModel.createFromRequest(req, function(err, data) { 
      res.send(data); 
     }); 
    } 
} 
+0

Danke Glen! Ich habe versucht, die Blueprint-Aktionen zu vermeiden. Aber ich weiß nicht was, wenn es am besten ist. Schau auf meine eigene Antwort, macht das Sinn? –

+1

@MartinSchaer, ich würde es nicht für echtes Projekt verwenden. Der erste Grund, das ist nicht offensichtlich, Richtlinien so zu verwenden. Ich meine, wenn ich Projekt habe und weiß, dass irgendwo Benutzer-ID hinzugefügt, um Körper zu beantragen, bevor es speichert, war Richtlinien der letzte Ort, an dem ich versuchen würde, es zu finden. Der zweite Grund ist, dass es schwer ist, diesen Code wiederzuverwenden. Wenn Sie anderen Methoden des Modells eine Benutzer-ID hinzufügen möchten, sollten Sie diese Funktion erneut schreiben (oder eine einzelne Richtlinie erstellen, um eine Benutzer-ID hinzuzufügen). Dies ist meiner Meinung nach, aber ich glaube, dass die Richtlinien für die Zugriffsmanipulation verwendet werden sollten und dass Modelle für die Datenmanipulation verwendet werden sollten. –

-2

Sails sind zweckmäßigerweise req und res Objekte den Lebenszyklusrückrufen nicht ausgesetzt, was bedeutet, dass Sie nicht tun sollten, was Sie versuchen zu tun.

Wenn Sie versuchen, die Benutzer-ID festzulegen, können Sie diese ID zum Objekt req.query innerhalb einer Sails-Richtlinie hinzufügen. Wenn Sie nur den Standard-REST-Endpunkt verwenden, wird die ID automatisch zum Modell hinzugefügt. Mein sails-auth Modul tut etwas ähnliches.

+0

Ja. Aber was, wenn ich dem Objekt eine Verlaufsverfolgung hinzufügen möchte. Und nicht die Geschichte Teil jedes Mal schreiben (wie Aktualisieren eines Objekts, das der "Benutzer" hat das Attribut "Farbe" geändert) Und das einzige, was ich will ist, den aktuellen angemeldeten Benutzer das Objekt nach der Aktualisierung hinzufügen. Auch die Abfrage der aktuellen Express-URL, die für den aktuellen Anruf verwendet wird, wäre ebenfalls gut. –

Verwandte Themen