Express.js middleware that allows HTTP method override functionality for environments where clients don't natively support HTTP verbs like PUT, DELETE, and PATCH
npx @tessl/cli install tessl/npm-method-override@3.0.0Method Override provides Express.js middleware that allows HTTP method override functionality, enabling the use of HTTP verbs like PUT, DELETE, and PATCH in environments where clients don't natively support them (such as HTML forms or legacy browsers).
npm install method-overrideconst methodOverride = require('method-override');For ES modules:
import methodOverride from 'method-override';const express = require('express');
const methodOverride = require('method-override');
const app = express();
// Use default X-HTTP-Method-Override header
app.use(methodOverride());
// Override using query parameter
app.use(methodOverride('_method'));
// Override using custom header
app.use(methodOverride('X-HTTP-Method'));Method Override is built around a simple middleware pattern:
Creates Express.js middleware to override the req.method property with a new value pulled from the provided getter.
/**
* Creates method override middleware
* @param {string|function} [getter='X-HTTP-Method-Override'] - Method to get override value
* @param {object} [options] - Configuration options
* @param {string[]} [options.methods=['POST']] - Allowed original request methods
* @returns {function} Express.js middleware function
*/
function methodOverride(getter, options);The middleware function signature:
/**
* Express.js middleware that overrides req.method
* @param {object} req - Express request object
* @param {object} res - Express response object
* @param {function} next - Next middleware function
*/
function middleware(req, res, next);Usage Examples:
// Header-based override (default)
app.use(methodOverride());
app.use(methodOverride('X-HTTP-Method-Override'));
// Query parameter override
app.use(methodOverride('_method'));
// Custom function getter
app.use(methodOverride(function (req, res) {
if (req.body && typeof req.body === 'object' && '_method' in req.body) {
var method = req.body._method;
delete req.body._method;
return method;
}
}));
// Multiple format support
app.use(methodOverride('X-HTTP-Method')); // Microsoft
app.use(methodOverride('X-HTTP-Method-Override')); // Google/GData
app.use(methodOverride('X-Method-Override')); // IBMThe getter parameter determines how to extract the override method from the request:
/**
* Getter can be a string or function
* @typedef {string|function} Getter
*/
/**
* Custom getter function
* @param {object} req - Express request object
* @param {object} res - Express response object
* @returns {string|undefined} Override method or undefined
*/
function customGetter(req, res);String Getter Rules:
X- are treated as HTTP header names'X-HTTP-Method-Override' if not specified/**
* Configuration options for method override
* @typedef {object} MethodOverrideOptions
* @property {string[]|null} [methods=['POST']] - Allowed original request methods
*/Options Details:
['POST']null to allow all methods (security risk)['POST'], ['POST', 'PATCH']The middleware modifies the Express request object:
/**
* Properties added/modified on req object
* @property {string} req.method - Overridden HTTP method (if valid override found)
* @property {string} req.originalMethod - Original HTTP method (preserved)
*/HTML Forms:
<form method="POST" action="/resource?_method=DELETE">
<button type="submit">Delete resource</button>
</form>XMLHttpRequest:
var xhr = new XMLHttpRequest();
xhr.open('POST', '/resource', true);
xhr.setRequestHeader('X-HTTP-Method-Override', 'PUT');
xhr.send(data);Body Parameter (with custom getter):
<form method="POST" action="/resource" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="_method" value="DELETE">
<button type="submit">Delete resource</button>
</form>