Ganci laterali del server del router di ferro Meteor
-
21-12-2019 - |
Domanda
Usando il router di ferro È possibile aggiungere ganci come così:
// this hook will run on almost all routes
Router.before(mustBeSignedIn, {except: ['login', 'signup', 'forgotPassword']});
// this hook will only run on certain routes
Router.before(mustBeAdmin, {only: ['adminDashboard', 'adminUsers', 'adminUsersEdit']});
.
Vedi: https://github.com/eventendmind/iron-Router#Us-Ganci
Ma le documentazioni non dicono come rendere questi ganci "lato server".
L'idea è quella di creare un gancio che supervisiona la pubblicazione di raccolte per tutte le rotte, ad eccezione di uno o due percorsi specifici in cui voglio più controllo su ciò che è stato pubblicato.
Soluzione
Il router di ferro è solo lo stesso sia sul client che sul server e le dichiarazioni possono essere eseguite su una directory / file disponibile per il client che il server.
Per impostazione predefinita, i percorsi dichiarati sono per il client. Se si desidera che un percorso sia lato server, dichiari esplicitamente quindi includendo where: 'server'
.
Preso da Documenti ufficiali :
.Definizione dei percorsi e configurazione del router è quasi identico al server e sul client. Per impostazione predefinita, i percorsi vengono creati come percorsi client. È possibile specificare che un percorso è destinato al server fornendo un punto in cui proprietà al percorso come questa:
Router.map(function () {
this.route('serverRoute', {
where: 'server',
action: function () {
// some special server side properties are available here
}
});
});
.
.Si noti che dove deve essere posizionato in router.Map, non sul controller.
Funzioni di azione del server (routecontrollers) hanno diverse proprietà e metodi disponibili. Vale a dire, non c'è ancora il rendering sul server. Quindi il metodo di rendering non è disponibile. Inoltre, non è possibile aspettare l'abbonamento o chiamare il metodo di attesa sul server. I percorsi del server ottengono la richiesta nuda, la risposta e le prossime proprietà della richiesta di connessione, nonché l'oggetto Params proprio come nel client.
Router.map(function () {
this.route('serverFile', {
where: 'server',
path: '/files/:filename',
action: function () {
var filename = this.params.filename;
this.response.writeHead(200, {'Content-Type': 'text/html'});
this.response.end('hello from server');
}
});
});
.
Come vedi, c'è solo una convenzione di denominazione, quindi puoi indicare qualcosa del genere:
Router.before(someFilter, {only: ['clientRoute1', 'clientRoute2', 'serverRoute1']});
.
o
Router.before(someOtherFilter, {except: ['clientRoute3', 'clientRoute4', 'serverRoute2']});
.
Proprio come vorresti normalmente.