@naveenm0307/api-logger-middleware
Version:
Middleware to log API calls and send them to a central server
80 lines (64 loc) ⢠2.8 kB
JavaScript
const { createClient } = require("@supabase/supabase-js");
// Initialize Supabase client
// const supabase = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_KEY);
const supabaseUrl = 'https://zliaheybskltrdzbecad.supabase.co';
const supabaseKey='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InpsaWFoZXlic2tsdHJkemJlY2FkIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDIwMzE1NzksImV4cCI6MjA1NzYwNzU3OX0.1EZLzIU-mLmbcGBeE9sX1BA0Pc_3Crv7qcRbhmWu4k8';
const supabase = createClient(supabaseUrl, supabaseKey);
module.exports = function logMiddleware(projectId) {
if (!projectId) throw new Error("Project ID is required");
return async function (req, res, next) {
const startTime = Date.now();
// Capture original res.end and res.json
const originalEnd = res.end;
const originalJson = res.json;
// Store response data
let responseBody;
// Override res.json to capture response data
res.json = function(data) {
responseBody = data;
return originalJson.call(this, data);
};
res.end = async function (...args) {
const duration = Date.now() - startTime;
// Prepare request data
const requestData = {
query: req.query || {},
params: req.params || {},
body: req.method === 'POST' ? req.body : {},
};
// Prepare log entry
const logEntry = {
project_id: projectId,
route: req.url,
method: req.method,
status: res.statusCode,
duration_ms: duration,
request_data: requestData,
response_data: responseBody || args[0]?.toString(), // Convert Buffer to string if needed
headers: req.headers,
created_at: new Date().toISOString(),
};
try {
// Insert log entry into Supabase
const { error } = await supabase.from("logs").insert([logEntry]);
if (error) {
console.error("Error inserting log into Supabase:", error.message);
}
// Console log for development
console.log('\nš API Request Log:');
console.log('š Route:', req.url);
console.log('š Method:', req.method);
console.log('ā±ļø Duration:', duration + 'ms');
console.log('š Status:', res.statusCode);
console.log('š„ Request Data:', JSON.stringify(requestData, null, 2));
console.log('š¤ Response Data:', JSON.stringify(responseBody || args[0]?.toString(), null, 2));
console.log('ā Timestamp:', new Date().toISOString());
console.log('-------------------\n');
} catch (err) {
console.error("Database Error:", err.message);
}
originalEnd.apply(res, args);
};
next();
};
};