response-standardizes
v1.1.2
Published
Standardized HTTP status response handlers for Express.js
Maintainers
Readme
HTTP Status Code Response Library
A comprehensive TypeScript library for standardizing HTTP responses in Express.js applications with proper status codes and consistent response formats.
🚀 Quick Start — Step by Step
1) Install
npm install response-standardizes
2) Import and initialize
import express from 'express';
import {
ResponseSuccess,
ResponseCreated,
ResponseNoContent,
ResponseBadRequest,
ResponseUnauthorized,
ResponseNotFound,
ResponseInternalServerError,
ResponseMovedPermanently,
ResponseFound,
ResponseProcessing,
createAppLogger
} from 'your-package-name';
const app = express();
const logger = createAppLogger();
app.use(express.json());3) (Optional) Log each request with Winston
app.use((req, _res, next) => {
logger.info({ method: req.method, url: req.url });
next();
});4) Add success endpoints (2xx)
// 200 OK
app.get('/api/data', (req, res) => {
const data = { message: 'Hello World' };
return ResponseSuccess(res, 'Data retrieved successfully', data);
});
// 201 Created
app.post('/api/users', (req, res) => {
const newUser = { id: 1, name: req.body.name };
return ResponseCreated(res, 'User created successfully', newUser);
});
// 204 No Content
app.delete('/api/users/:id', (req, res) => {
// delete logic
return ResponseNoContent(res, 'User deleted successfully');
});5) Add client error endpoints (4xx)
// 400 Bad Request
app.post('/api/validate', (req, res) => {
if (!req.body.email) {
return ResponseBadRequest(res, 'Email is required');
}
return ResponseSuccess(res, 'Valid payload');
});
// 401 Unauthorized
app.get('/api/protected', (req, res) => {
if (!req.headers.authorization) {
return ResponseUnauthorized(res, 'Authentication required');
}
return ResponseSuccess(res, 'Authorized');
});
// 404 Not Found
app.get('/api/users/:id', (req, res) => {
const user = undefined; // replace with lookup
if (!user) {
return ResponseNotFound(res, 'User not found');
}
return ResponseSuccess(res, 'User found', user);
});6) Add server error handling (5xx)
app.get('/api/risky-operation', (req, res) => {
try {
// riskyOperation();
return ResponseSuccess(res, 'Operation completed');
} catch (error) {
logger.error('Risky operation failed', error);
return ResponseInternalServerError(res, 'Something went wrong');
}
});7) Add redirections (3xx)
// 301 Moved Permanently
app.get('/old-endpoint', (req, res) => {
return ResponseMovedPermanently(res, 'This resource has moved', { newLocation: '/new-endpoint' });
});
// 302 Found (Temporary)
app.get('/temp-redirect', (req, res) => {
return ResponseFound(res, 'Temporarily redirected', { redirectTo: '/alternative-endpoint' });
});8) (Optional) Informational responses (1xx)
// 102 Processing
app.post('/api/long-operation', (req, res) => {
ResponseProcessing(res, 'Request is being processed');
// continue in background (e.g., queue / worker / websocket updates)
});9) Consistent response format
Success
{
"success": true,
"message": "Request was successful",
"data": { "id": 1, "name": "Example" }
}Error
{
"success": false,
"message": "Resource not found",
"data": null
}10) Customize default messages
ResponseSuccess(res, 'Custom success message', data);
ResponseNotFound(res, 'We looked everywhere but could not find it');11) Test without a real Express res
// Example Jest test
test('should return success response', () => {
const response = ResponseSuccess(null, 'Test message', { id: 1 });
expect(response.success).toBe(true);
expect(response.message).toBe('Test message');
expect(response.data.id).toBe(1);
});12) Start the server
app.listen(3000, () => {
logger.info('Server running on http://localhost:3000');
});📚 API Reference (by status class)
1xx — Informational
ResponseContinue(res, message, data)ResponseSwitchingProtocols(res, message, data)ResponseProcessing(res, message, data)ResponseEarlyHints(res, message, data)
2xx — Success
ResponseSuccess(res, message, data)— 200 OKResponseCreated(res, message, data)— 201 CreatedResponseAccepted(res, message, data)— 202 AcceptedResponseNonAuthoritativeInformation(res, message, data)— 203ResponseNoContent(res, message, data)— 204 No ContentResponseResetContent(res, message, data)— 205ResponsePartialContent(res, message, data)— 206
3xx — Redirection
ResponseMultipleChoices(res, message, data)— 300ResponseMovedPermanently(res, message, data)— 301ResponseFound(res, message, data)— 302ResponseSeeOther(res, message, data)— 303ResponseNotModified(res, message, data)— 304ResponseTemporaryRedirect(res, message, data)— 307ResponsePermanentRedirect(res, message, data)— 308
4xx — Client Errors
ResponseBadRequest(res, message, data)— 400ResponseUnauthorized(res, message, data)— 401ResponsePaymentRequired(res, message, data)— 402ResponseForbidden(res, message, data)— 403ResponseNotFound(res, message, data)— 404ResponseMethodNotAllowed(res, message, data)— 405ResponseNotAcceptable(res, message, data)— 406ResponseProxyAuthenticationRequired(res, message, data)— 407ResponseRequestTimeout(res, message, data)— 408ResponseConflict(res, message, data)— 409ResponseGone(res, message, data)— 410ResponseLengthRequired(res, message, data)— 411ResponsePreconditionFailed(res, message, data)— 412ResponsePayloadTooLarge(res, message, data)— 413ResponseUriTooLong(res, message, data)— 414ResponseUnsupportedMediaType(res, message, data)— 415ResponseRangeNotSatisfiable(res, message, data)— 416ResponseExpectationFailed(res, message, data)— 417ResponseImATeapot(res, message, data)— 418ResponseUnprocessableEntity(res, message, data)— 422ResponseTooManyRequests(res, message, data)— 429
5xx — Server Errors
ResponseInternalServerError(res, message, data)— 500ResponseNotImplemented(res, message, data)— 501ResponseBadGateway(res, message, data)— 502ResponseServiceUnavailable(res, message, data)— 503ResponseGatewayTimeout(res, message, data)— 504ResponseHttpVersionNotSupported(res, message, data)— 505
🧭 Error Handling Best Practices
Always return the response function result
return ResponseNotFound(res, 'User not found');Use the most appropriate status code for the scenario
Log errors with the provided logger and avoid leaking sensitive details
try { /* risky work */ } catch (error) { logger.error('Operation failed', error); return ResponseInternalServerError(res, 'Operation failed'); }
📝 Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests for new functionality
- Submit a pull request
📄 License
MIT License — see LICENSE for details.
