Skip to main content

Method Override

Enable HTTP verb support (PUT, PATCH, DELETE) for clients that only support GET and POST (like HTML forms or older browsers).

Quick Start​

import { Server } from "balda";

const app = new Server({
plugins: {
methodOverride: {
methods: ["POST"],
header: "X-HTTP-Method-Override",
},
},
});

Configuration​

Basic Usage​

methodOverride({
methods: ["POST"], // Methods that can be overridden
header: "X-HTTP-Method-Override", // Header to read override from
});

Custom Configuration​

methodOverride({
methods: ["POST", "GET"],
header: "X-HTTP-Method",
});

Options​

OptionTypeDefaultDescription
methodsstring[]['POST']HTTP methods that can be overridden
headerstringX-HTTP-Method-OverrideHeader name to read the override method from

How It Works​

  1. Checks if request method is in allowed methods (default: POST)
  2. Reads override method from header
  3. Validates override method (GET, POST, PUT, PATCH, DELETE)
  4. Updates req.method with the override value

Use Cases​

HTML Forms​

HTML forms only support GET and POST. Use this to enable PUT/DELETE:

<form method="POST" action="/users/123">
<input type="hidden" name="_method" value="DELETE" />
<button type="submit">Delete User</button>
</form>
// With body parser that extracts _method field
app.post("/users/:id", (req, res) => {
if (req.method === "DELETE") {
// Handle deletion
}
});

Client Requests​

// Client-side
fetch("/api/users/123", {
method: "POST",
headers: {
"X-HTTP-Method-Override": "DELETE",
"Content-Type": "application/json",
},
});
// Server-side - receives as DELETE
app.delete("/api/users/:id", (req, res) => {
// Handles the request
});

Example: Complete Setup​

import { Server, methodOverride, json } from "balda";

const app = new Server({
plugins: {
json: {
sizeLimit: "10mb",
},
methodOverride: {
methods: ["POST"],
header: "X-HTTP-Method-Override",
},
},
});

// This route will handle both actual DELETE and overridden POST->DELETE
app.delete("/users/:id", (req, res) => {
res.json({ message: "User deleted" });
});