2015-02-06 10 views
5

Supponiamo che io ho questo modello:Come accedere all'oggetto richiesta nei callback del ciclo di vita sails.js?

module.exports = { 

    attributes: { 

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

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

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

ho bisogno di impostare l'ID utente corrente all'attributo CreatedBy del modello. Pensavo di poterlo fare con il callback del ciclo di vita beforeValidate, ma non posso accedere all'oggetto request dove è memorizzato l'utente corrente. C'è un modo per accedervi, o dovrei risolvere questo in qualche modo?

ho provato questo senza successo:

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

risposta

7

Poiché le richieste sono al di fuori del campo di applicazione della ORM, ho indovinato il mio approccio era sbagliato, e che avevo bisogno di aggiungere i dati CreatedBy al req.body all'interno di un middleware. Ma dal momento che ciò non va fatto per ogni richiesta, ho pensato che sarebbe stato meglio farlo con una politica. In questo modo:

PostController: { 

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

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

In questo modo non è necessario eseguire l'override del progetto.

+1

Sono sorpreso che molte persone non lo consigliano. L'aggiunta sempre nel controller è un anti-pattern per gli obiettivi del progetto. Le politiche lo rendono molto più facile. –

+0

Ok, ma come posso accedere a req all'interno del callback del ciclo di vita grazie a questa politica? – pie6k

+0

Fantastico! Questo ha risolto il mio problema! –

1

lo si può fare in due modi.

Per prima cosa è necessario aggiungere i dati nel controller. Qualcosa di simile

// /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 /* ... */) 
    } 
} 

Se avete un sacco di manipolazione dei dati con MyModel potrebbe essere fastidioso. Quindi puoi aggiungere un metodo statico al tuo modello per salvarlo con l'id utente. Qualcosa di simile:

// /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); 
    } 
} 

E l'uso nel vostro controller

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

Grazie Glen! Stavo cercando di evitare di scavalcare le azioni del progetto. Ma non so cosa sia meglio. Guarda la mia risposta, ha senso? –

+1

@MartinSchaer, non lo userei per progetti reali. La prima ragione, non è ovvio usare le politiche in questo modo. Intendo dire che se ho un progetto e so che da qualche parte l'ID utente è stato aggiunto per richiedere il corpo prima che venga salvato, le politiche erano l'ultimo posto in cui avrei cercato di trovarlo. La seconda ragione è che è difficile riutilizzare questo codice. Se si desidera aggiungere l'id utente ad altri metodi di modello, è necessario scrivere di nuovo questa funzione (oppure creare una singola politica per aggiungere l'id utente). Questa è la mia opinione, ma credo che la politica dovrebbe essere utilizzata per la manipolazione degli accessi e che i modelli dovrebbero essere utilizzati per la manipolazione dei dati. –

-2

Sails appositamente non espone gli oggetti req e res ai callback del ciclo di vita, il che significa che non si dovrebbe fare ciò che si sta tentando di fare.

Se si sta tentando di impostare l'id utente, è possibile aggiungere tale ID all'oggetto req.query all'interno di un criterio di vele; quindi se si utilizza solo l'endpoint REST standard, l'ID verrà automaticamente aggiunto al modello. Il mio modulo sails-auth fa qualcosa di simile.

+0

Sì. Ma cosa succede se voglio aggiungere un tracciamento della cronologia all'oggetto. E non scrivere la parte della cronologia ogni volta da menu (come l'aggiornamento di un oggetto che l'utente ha modificato l'attributo "colore") E l'unica cosa che voglio è aggiungere l'utente loggato corrente all'oggetto dopo averlo aggiornato. Anche interrogare l'url espresso corrente utilizzato per la chiamata corrente sarebbe altrettanto valido. –