cd..blog

Building Secure & Performant APIs: Express and Cloudflare with TypeScript

const published = "Dec 18, 2025, 10:21 PM";const readTime = 4 min;
expresscloudflaretypescriptapisecurity
Learn to integrate Express.js with Cloudflare for robust, secure, and high-performance APIs using TypeScript. This guide covers setup, best practices, and actionable insights.

As web applications scale, balancing performance with robust security becomes paramount. Combining Express.js for your API backend with Cloudflare's powerful edge network services offers a potent solution. This article guides you through integrating these technologies using TypeScript, ensuring your applications are fast, secure, and maintainable.

Why Express.js and Cloudflare?

Express.js is a minimal and flexible Node.js web application framework that provides a robust set of features for web and mobile applications. It's an excellent choice for building scalable RESTful APIs due to its simplicity and extensive middleware ecosystem.

Cloudflare is a global network that offers DNS, CDN, security (WAF, DDoS protection), and performance optimization services, sitting between your users and your origin server. It enhances your Express application by offloading traffic, mitigating threats, and speeding up content delivery.

Express API Foundation with TypeScript

First, let's set up a basic Express API in TypeScript. Ensure you have Node.js and npm/yarn installed.

npm init -y
npm install express typescript @types/express ts-node-dev
npx tsc --init

Configure tsconfig.json with "outDir": "./dist", "rootDir": "./src", and "esModuleInterop": true.

Now, create your Express server in src/index.ts:

// src/index.ts
import express from 'express';
import { Request, Response, NextFunction } from 'express';

const app = express();
const PORT = process.env.PORT || 3000;

// Cloudflare sits in front, so we trust its proxy headers.
// This allows req.ip to correctly reflect the client's IP address.
app.set('trust proxy', true);

// Middleware to log Cloudflare headers for debugging/monitoring
const cloudflareLogger = (req: Request, res: Response, next: NextFunction) => {
    console.log('--- Cloudflare Request Info ---');
    console.log(`Client IP: ${req.headers['cf-connecting-ip'] || req.ip}`);
    console.log(`CF-Ray ID: ${req.headers['cf-ray']}`);
    console.log(`Protocol: ${req.headers['x-forwarded-proto']}`);
    console.log('-------------------------------');
    next();
};

app.use(cloudflareLogger);
app.use(express.json()); // Enable JSON body parsing

app.get('/', (req: Request, res: Response) => {
    res.json({
        message: "Hello from Express!",
        clientIp: req.ip,
        cloudflareRayId: req.headers['cf-ray']
    });
});

app.get('/api/data', (req: Request, res: Response) => {
    // This endpoint could serve dynamic data
    res.json({ data: "This is some secure data from your API." });
});

app.listen(PORT, () => {
    console.log(`Server running on http://localhost:${PORT}`);
});

Add a start script to your package.json:

"scripts": {
    "start": "ts-node-dev --respawn --transpile-only src/index.ts"
}

Run npm start to get your Express server running.

Integrating with Cloudflare

1. DNS and Proxy Setup

Point your domain's A/AAAA record to your server's IP address within the Cloudflare dashboard. Ensure the orange cloud icon is enabled to proxy traffic through Cloudflare. This activates Cloudflare's CDN, WAF, and other services.

2. Secure TLS with Origin CA

For robust end-to-end encryption, set your Cloudflare SSL/TLS encryption mode to "Full (strict)". Generate a free Cloudflare Origin CA certificate and install it on your origin server (e.g., Nginx, Apache, or directly in Node.js if terminating TLS there). This ensures traffic between Cloudflare and your Express server is encrypted and authenticated.

3. Real Client IP Handling

When Cloudflare proxies requests, the req.socket.remoteAddress in Express will show Cloudflare's IP. To get the actual client's IP, Cloudflare sends the CF-Connecting-IP header. By setting app.set('trust proxy', true); in Express, req.ip will automatically resolve to the client's original IP from this header, as demonstrated in our cloudflareLogger middleware.

4. Edge Security & Performance

Cloudflare's edge network provides significant benefits without direct Express configuration:

  • DDoS Protection: Automatically mitigates volumetric attacks before they reach your server.
  • Web Application Firewall (WAF): Protects against common web vulnerabilities (e.g., SQL injection, XSS) by inspecting requests at the edge.
  • Caching: Cloudflare caches static assets (images, CSS, JS) at its edge locations, reducing the load on your Express server and speeding up delivery.
  • Rate Limiting: Configure rules in Cloudflare to block or challenge excessive requests, preventing abuse and protecting your API from brute-force attacks. Express doesn't need to implement rate limiting directly; it just receives fewer malicious requests.

5. Leveraging Cloudflare Headers

Cloudflare injects several useful headers into requests forwarded to your origin. We've used CF-Connecting-IP for the client's real IP and CF-Ray for a unique request identifier, which is invaluable for debugging and tracing requests through Cloudflare's network to your Express application. Other headers like CF-Visitor (containing client's TLS version) can also be useful for analytics or security policies.

Best Practices for a Robust Setup

  • Always use "Full (strict)" SSL/TLS with an Origin CA certificate for maximum security.
  • Configure app.set('trust proxy', true) in Express to correctly identify client IPs.
  • Utilize Cloudflare's WAF and Rate Limiting rules to offload security concerns from your application logic.
  • Log CF-Ray and CF-Connecting-IP in your Express application for enhanced debugging and security auditing.
  • Implement proper error handling in Express to gracefully manage unexpected situations, even when Cloudflare is shielding your server.

Conclusion

Integrating Express.js with Cloudflare provides a powerful, secure, and high-performance architecture for your web applications. By leveraging Cloudflare's edge network for security, caching, and traffic management, your TypeScript-based Express API can focus on its core business logic, delivering a superior experience to your users while remaining resilient against threats.