在Node.js中,可以使用中間件來識別和處理異常請求。以下是一個使用Express框架的示例,展示了如何創建一個中間件來捕獲和記錄異常請求:
npm install express morgan
app.js的文件,并添加以下代碼:const express = require('express');
const morgan = require('morgan');
const fs = require('fs');
const path = require('path');
const app = express();
// 創建一個寫入流,用于將日志寫入文件
const accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), { flags: 'a' });
// 使用Morgan中間件記錄HTTP請求
app.use(morgan('combined', { stream: accessLogStream }));
// 自定義異常請求中間件
app.use((err, req, res, next) => {
console.error('Exception caught:', err);
// 記錄異常請求的信息
const status = err.status || 500;
const message = err.message || 'Internal Server Error';
const stackTrace = err.stack || '';
const logEntry = `[${new Date().toISOString()}] [${status}] [${req.method}] ${req.url} - ${message}\n${stackTrace}\n`;
// 將異常請求的信息寫入日志文件
accessLogStream.write(logEntry);
// 返回錯誤響應
res.status(status).json({ message: message });
});
// 示例路由,用于觸發異常
app.get('/error', (req, res, next) => {
try {
throw new Error('This is an error');
} catch (err) {
next(err);
}
});
// 啟動服務器
const port = 3000;
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
在這個示例中,我們創建了一個自定義的異常請求中間件,它捕獲并記錄異常請求的信息,包括請求方法、URL、狀態碼、錯誤消息和堆棧跟蹤。然后,我們創建了一個示例路由/error,用于觸發異常。
當訪問/error路由時,異常請求中間件會捕獲異常,并將相關信息記錄到access.log文件中。同時,服務器會返回一個包含錯誤消息的JSON響應。
要運行此示例,請在終端中執行以下命令:
node app.js
然后訪問http://localhost:3000/error,查看日志文件access.log以獲取異常請求的詳細信息。