Node.jsBackendBest PracticesPerformance

Node.js Best Practices - 2024 Güncel Rehber

Production-ready Node.js uygulamaları için en iyi pratikler, güvenlik önlemleri ve performans optimizasyonları.

cyr0nix15 Aralık 20242 min read

Node.js Best Practices

Node.js ile production-ready uygulamalar geliştirmek için bilmeniz gereken en önemli pratikler.

1. Proje Yapısı

İyi organize edilmiş bir proje yapısı:

src/
├── config/         # Konfigürasyon dosyaları
├── controllers/    # Route controller'ları
├── middlewares/    # Express middleware'leri
├── models/         # Database modelleri
├── routes/         # API route tanımları
├── services/       # Business logic
├── utils/          # Yardımcı fonksiyonlar
└── index.js        # Entry point

2. Environment Management

// config/index.js
module.exports = {
  port: process.env.PORT || 3000,
  mongoUri: process.env.MONGODB_URI,
  jwtSecret: process.env.JWT_SECRET,
  nodeEnv: process.env.NODE_ENV || 'development',
};

3. Error Handling

Global error handler kullanın:

// middlewares/errorHandler.js
const errorHandler = (err, req, res, next) => {
  console.error(err.stack);

  res.status(err.status || 500).json({
    success: false,
    message: err.message || 'Internal Server Error',
    ...(process.env.NODE_ENV === 'development' && { stack: err.stack }),
  });
};

module.exports = errorHandler;

4. Async/Await Wrapper

const asyncHandler = (fn) => (req, res, next) => {
  Promise.resolve(fn(req, res, next)).catch(next);
};

// Kullanım
router.get('/users', asyncHandler(async (req, res) => {
  const users = await User.find();
  res.json(users);
}));

5. Güvenlik

const helmet = require('helmet');
const rateLimit = require('express-rate-limit');
const mongoSanitize = require('express-mongo-sanitize');

app.use(helmet());
app.use(mongoSanitize());
app.use(rateLimit({
  windowMs: 15 * 60 * 1000, // 15 dakika
  max: 100 // IP başına limit
}));

6. Logging

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  transports: [
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' }),
  ],
});

if (process.env.NODE_ENV !== 'production') {
  logger.add(new winston.transports.Console({
    format: winston.format.simple(),
  }));
}

7. Graceful Shutdown

process.on('SIGTERM', () => {
  console.log('SIGTERM received. Shutting down gracefully...');
  server.close(() => {
    console.log('Process terminated.');
    mongoose.connection.close(false, () => {
      process.exit(0);
    });
  });
});

Sonuç

Bu pratikleri uygulayarak daha güvenli, ölçeklenebilir ve bakımı kolay Node.js uygulamaları geliştirebilirsiniz.