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.