Node.js Express Api Validation İşlemleri

Estimated reading time: 22 minute(s)

Merhaba, bu yazımda Express.js ile uygulama geliştirirken, gelen isteklerin doğrulama işlemlerinin nasıl yapıldığını uygulamalı olarak göstermeye çalışacağım.

Express doğrulama işlemleri için yaygın olarak kullanılan iki farklı paket bulunmakta;

  1. “express-validation”
    https://www.npmjs.com/package/express-validation
  2. “express-validator”
    https://www.npmjs.com/package/express-validator

“express-validation” ile doğrulama

Doğrulama için “joi” paketini kullanır.
https://www.npmjs.com/package/joi

Şimdi örneğimizde kullanıcı kayıt olma ve giriş yapma istekleri için doğrulama senaryolarını uygulayalım.

Örnek projemiz için “npm init” ile bir proje oluşturduktan sonra aşağıdaki gibi dosya ve klasörleri oluşturalım;

Gerekli paketler;
npm install express
npm install express-validation

app.js – Projeyi başlatacak dosyamız.

'use strict';

const startServer = require('./src/api/server');

const start = async () => {
    await startServer();
};

start();

Senaryomuzda uygulama çalıştığında sadece bir api oluşturması gerekiyor. startServer()’ı çağırmamız yeterli.

server.js – Api’yi ayağa kaldırdığımız dosyamız.

'use strict';

const createServer = async () => {

    var express = require('express');
    const bodyParser = require('body-parser');
    const routes = require('./routes');
    const { ValidationError } = require('express-validation');

    var app = express();
    var PORT = 3000;

    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json());

    // Route'ları yüklüyoruz
    app.use('/api', routes());

    // Doğrulama hatalarını yakalıyoruz
    app.use(function (err, req, res, next) {
        if (err instanceof ValidationError) {
            return res.status(err.statusCode).json(err)
        }
        return res.status(500).json(err)
    })

    app.listen(PORT, function (err) {
        if (err) console.log(err);
        console.log("Server listening: ", "http://localhost:" + PORT + "/api");
    });

}

module.exports = createServer;

Express app oluşturduk, route’larımızı yükledik, doğrulamadan gelecek hataları yakaladık ve ilgili port üzerinden apiyi kaldırdık.

Tabii ki öncesinde routes ve validation dosyalarımızı da tamamlamamız gerek.

UserValidation.js – Kullanıcı ile ilgili gelecek istekler için doğrulama dosyamız.

Bu dosya tam olarak işin çekirdeği sayılabilir. Tüm validasyonlarımızı bu dosya içerisinde tanımlıyoruz.

'use strict';

const { Joi } = require('express-validation')

module.exports = {
    create: {
        body: Joi.object({
            firstname: Joi.string()
                .required(),
            surname: Joi.string()
                .required(),
            username: Joi.string()
                .alphanum()
                .min(3)
                .max(30)
                .required(),
            email: Joi.string()
                .email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } })
                .required(),
            password: Joi.string()
                .pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')),
            created: Joi.date()
                .default(Date.now),
        })
    },
    login: {
        body: Joi.object({
            email: Joi.string()
                .email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } })
                .required(),
            password: Joi.string()
                .pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')),
        })
    }
}

Joi bir çok veri için doğrulama ifadelerine sahip. Aşağıdaki adresten detaylı inceleyebilirsiniz.
https://joi.dev/api/

Route – index.js – Tüm route’larımızın tanımlanacağı dosyadır.

Örneğimizde sadece users olduğu için sadece onu tanımladık.

'use strict';

const express = require('express');
const users = require('./users');

const apiRouter = () => {
    const routes = express.Router();
    const usersRouter = users();
    routes.use('/users', usersRouter);
    return routes;
};

module.exports = apiRouter;

Route – users.js – Kullanıcı ile ilgili route’larımızın olduğu dosyadır.

Validasyonu route’a bağladığımız kısım tam olarak burasıdır.

'use strict';

const express = require('express');
const { validate } = require('express-validation')

const UserValidation = require('../../validations/UserValidation');

// api/users
const usersRouter = () => {
    const router = express.Router();

    router.post('/create', validate(UserValidation.create, {}, {}), async (req, res) => {
        // TODO
        var result = "Yeni kullanıcı eklendi.";
        res.status(201).send(result);
    })

    router.post('/login', validate(UserValidation.login, {}, {}), async (req, res) => {
        // TODO
        var result = "Giriş yapıldı";
        res.status(200).send(result);
    })

    return router;
};

module.exports = usersRouter;

Artık uygulamaya geçebiliriz.

Uygulamamızı “node app” komutunu kullanarak çalıştırıyoruz ve Postman aracılığıyla login endpointini test ediyoruz.

İlk olarak mail adresinde .com kullanmadan bir istekte bulunuyoruz.

Sonrasında .com’u dahil ettiğimizde doğrulama başarılı oluyor.

Projenin tamamına aşağıdan ulaşabilirsiniz;
https://github.com/YildirimMehmet/nodejs-api-express-validation

“express-validator” ile doğrulama

Aynı örneği bu kez “express-validator” ile yapalım.

Bu paket doğrulama için “validator” paketini kullanır.
https://www.npmjs.com/package/validator

Bu örneğimizin dosyaları aşağıdaki gibidir. Yukarıdaki örnekten farklı olarak sadece validator.js eklenmiştir.

Gerekli paketler;
npm install express
npm install express-validator

app.js, server.js ve routes/index.js dosyalarımız yukarıdaki örnekle tamamen aynı.

Validator.js – Tüm doğrulama işlemlerinin sonuçlarının işleneceği ara yazılımımız.

'use strict';

const { validationResult } = require('express-validator')

const validate = (req, res, next) => {
    const errors = validationResult(req)
    if (errors.isEmpty()) {
        return next()
    }
    const extractedErrors = []
    errors.array().map(err => extractedErrors.push({ [err.param]: err.msg }))

    return res.status(422).json({
        errors: extractedErrors,
    })
}

module.exports = {
    validate
}

UserValidation.js

User modelimiz için kurallarımızı tanımladığımız dosya.

'use strict';

const { body } = require('express-validator')

const rules = () => {
    return [
        body('firstname').not().isEmpty(),
        body('surname').not().isEmpty(),
        body('email').isEmail(),
        body('password').isLength({ min: 5 }),
    ]
}
module.exports = rules;

Route – users.js

Yukarıdaki örnekte olduğu gibi express-validator’ıda ara yazılım kullanarak sistemimize entegre ettik.

'use strict';

const express = require('express');
const { validate } = require('../validator');
const rules = require('../../validations/UserValidation');

// api/users
const usersRouter = () => {
    const router = express.Router();

    router.post('/create', rules(), validate, async (req, res) => {
        // TODO
        var result = "Yeni kullanıcı eklendi.";
        res.status(201).send(result);
    })

    router.post('/login', rules(), validate, async (req, res) => {
        // TODO
        var result = "Giriş yapıldı";
        res.status(200).send(result);
    })

    return router;
};

module.exports = usersRouter;

Herşey hazır..

Yine çalıştırdığımız Api’mizi, Postman aracılığıyla test edelim.

Email ve password alanlarını hatalı girdim, firstname ve surname alanlarını ise hiç göndermedim.

Doğru verilerle tekrar deneyelim.

Projenin tamamına aşağıdan ulaşabilirsiniz;
https://github.com/YildirimMehmet/nodejs-api-express-validator

Ek;

Eğer basit bir api geliştiriyorsanız validation modelleri parçalamanıza, hatta route kullanmanıza gerek kalmayabilir. Route – users.js dosyasına aşağıdaki kodu ekleyerek doğrulama işlemini uygulayabilirsiniz.

const { check, validationResult } = require('express-validator')

router.post('/login', [
    check('email', 'Geçerli bir e-posta giriniz.').isEmail(),
    check('password', 'Şifre en az 5 karakter olmalı').not().isEmpty().isLength({ min: 5 }),
],
    function (req, res) {
        const errors = validationResult(req);

        if (!errors.isEmpty()) {
            return res.status(422).jsonp(errors.array());
        } else {
            var result = "Giriş yapıldı";
            res.status(201).send(result);
        }
    }
);

Okuduğunuz için teşekkürler.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir