2012-09-23 11 views
6

Buduję aplikację ekspresową i chciałbym się dowiedzieć, jakie korzyści mogę uzyskać dzięki oprogramowaniu pośredniczącemu. Z grubsza chciałbym osiągnąć następujące z middleware.Organizacja oprogramowania pośredniego Node.js i sprawdzanie poprawności parametrów

Sporządzono:

  • Dodaj requestId do wszystkich tras
  • Uwierzytelnij żądanie
  • Sprawdź, czy użytkownik ma dostęp do danego zasobu (oprócz uwierzytelniania )

nie wykonano:

  • A) parametry Weryfikuj na danej trasie
  • B) Organizuj pośredniczące w rozsądny sposób, jeśli różni się on od trasy do trasy i 3 middleware nazywane są rutynowo na trasie

I zdefiniowane moja middleware w osobnym pliku i zaimportować go do app.js tak:

var middleware = require('./middleware'); 
var requestId = middleware.requestId; 
var authenticate = middleware.authenticate; 

aby zastosować go do wszystkich tras dodam to wyrazić config:

var app = express.createServer(); 
app.configure(function() { 
    app.use(express.logger()); 
    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(requestId); // add requestId to all incoming requests 
}); 

I do specyfiki trasy, dodaję go jako app.get argumentu:

var routes = require('./v1/routes'); 
app.get("/v1/foo", routes.foo); 
app.get("/v1/bar", authenticate, routes.bar); 

PROBLEM

ja bym chciała mieć middleware, że mogę użyć do sprawdzenia parametrów

validate('x','y','z') 

i używać go tak jak na danej trasie:

app.get("/v1/bar", authenticate, validate('x','y','z'), routes.bar); 

Czy jest to dobry sposób na zrobienie tego? A może powinienem sprawdzać tylko na podstawie trasy w plikach definicji trasy?

Problem B

Czy istnieje lepszy sposób na porządkowanie i wykorzystywanie moich middleware, które należy wziąć pod uwagę?

Aktualizacja

Szukam sposobu, aby potwierdzić parametry, które zmieniają się w poszczególnych trasach. Poniższe oczywiście nie działają - nie mogę przekazać paramów do oprogramowania pośredniczącego - ale czy istnieje sposób zdefiniowania oprogramowania pośredniego, które to robi i nazywa to tak, jak powiedziałem powyżej?

var validateParams = function (req, res, params, callback) { 
    // Make sure the required parameters are in the request 
    console.log('checking for params '+params); 
    for (var i = 0; i < params.length; i++) { 
    var param = params[i]; 
    if(!(param in req.query)){ 
     logger.info('cannot find param ['+param+'] in req: '+JSON.stringify(req.query)); 
     res.writeHead(400, { 
     "Content-Type": "application/json" 
     }); 
     var out = { 
     "err": "request missing required parameters" 
     }; 
     res.end(JSON.stringify(out)); 
     return;  
    } 
    } 
    callback(); 
} 
+0

Będziesz chciał przekazać polecenie re, do oprogramowania pośredniego, aby sprawdzić poprawność (req, res), a następnie podjąć z niego działanie. Zwykle jest to prostsze niż przekazywanie z góry określonych zmiennych. – Brandon

+0

Spróbuj zajrzeć do wyrażenia ekspresowego. Nie użyłem go w oprogramowaniu pośredniczącym, ale wygląda na to, że jest to możliwe: https://github.com/ctavan/express-validator – chovy

Odpowiedz

2

PROBLEM

app.get("/v1/bar", authenticate, validate, routes.bar); 

function validate(req,res,next){ 

//Get all parameters here by req.params and req.body.parameter 
//validate them and return. 
if(validation_true) 
next() 
} 

Problem B

Można używać middleware w taki sposób, że nie zawsze trzeba zadzwonić uwierzytelniania i zatwierdź nazywane są automatycznie. Ale to może doprowadzić do bałaganu, np. Twoje oprogramowanie pośrednie będzie wtedy działało przy każdym wywołaniu, więc dla SIGNUP/REGISTER nie ma sensu przeprowadzania uwierzytelniania.

Przy sprawdzaniu poprawności czasami trzeba zweryfikować pocztę e-mail, czasem telefonicznie. więc oboje nie mogą się dogadać.

Korzystanie z nich osobno przy każdym połączeniu wydaje mi się NAJLEPSZĄ drogą do mnie.

+0

Dla A, na co patrzyłem na sprawdzanie poprawności różnych zestawów parametrów dla różnych tras - sprawdzanie poprawności (x), sprawdzanie poprawności (x, y), sprawdzanie poprawności (x, y, z). Czy można przekazać parametry takie jak to, czy po prostu ustawię zestaw parametrów jako tablicę i przekażę ją w sposób podobny do sprawdzania poprawności (req, res, desiredparam, następny) ... – nflacco

+0

cóż, tak. Ale myślę, że powinieneś wykonywać funkcje SUB i przekazywać je do funkcji sprawdzania poprawności. Podobnie jak validate_email (req.body.email); lub nawet validate_desired (desiredparams), a dla trasy powinieneś sprawdzić ponownie parametry, ** PS: Tak to robię. ** :) –

+0

OK, wydaje się całkiem rozsądne – nflacco

2

Możesz użyć express-validation do sprawdzenia treści, zapytań, parametrów, nagłówków i plików cookie żądania. Odpowiada z błędami, jeśli którakolwiek ze skonfigurowanych reguł sprawdzania poprawności nie działa.

var validate = require('express-validation'), 
    Joi = require('joi'); 

app.post('/login', validate({ 
    body: { 
    email: Joi.string().email().required(), 
    password: Joi.string().regex(/[a-zA-Z0-9]{3,30}/).required() 
    } 
}), function(req, res){ 
    res.json(200); 
}); 

Spowoduje to sprawdzenie, czy parametry treści wiadomości e-mail i hasła są zgodne z regułami sprawdzania poprawności.

Jeśli weryfikacja nie powiedzie się, odpowie z następującym błędem.

{ 
    "status": 400, 
    "statusText": "Bad Request", 
    "errors": [ 
    { 
     "field": "password", 
     "location": "body", 
     "messages": [ 
     "the value of password is not allowed to be empty", 
     "the value of password must match the regular expression /[a-zA-Z0-9]{3,30}/" 
     ], 
     "types": [ "any.empty", "string.regex.base" ] 
    } 
    ] 
} 

Możesz również sprawdzić moje repozytorium express-mongoose-es6-rest-api dla pełnej integracji.

1

Można również użyć funkcji wyższego rzędu (funkcja, która zwraca funkcję). Tym samym przepuszczając tablicę parametrów specyficznych dla punktu końcowego do sprawdzenia.

module.export = Class RequestValidator { 
    static validate(params) { 
    return function(req, res, next){ 
     for(const param of params) { 
     validateYourParams here... 
     if (validation fails) { 
     return next(new Error()); 
     } 
     } 
     next(); 
    } 
    } 
} 

W ramach opisu trasy można teraz wywołać oprogramowanie pośredniczące do sprawdzania poprawności i przekazać do niego argumenty dotyczące trasy.

const RequestValidator = require('your-validation-middleware'); 
const controller = require('your-controller'); 

app.post('/path') 
    .RequestValidator.validate(
    [{ 
    name: 'paramName', 
    type: 'boolean' 
    }, 
    { 
    name: 'paramName2', 
    type: 'string' 
    } 
    ]) 
    .Controller.handleRequest;