86 lines
1.9 KiB
JavaScript
86 lines
1.9 KiB
JavaScript
const logger = require("./logger");
|
||
|
||
/**
|
||
* 安全发送响应,防止重复发送导致的ERR_HTTP_HEADERS_SENT错误
|
||
* @param {Object} res - Express响应对象
|
||
* @param {*} data - 要发送的数据
|
||
* @param {boolean} isJson - 是否以JSON格式发送
|
||
* @returns {boolean} - 是否成功发送
|
||
*/
|
||
function safeSend(res, data, isJson = true) {
|
||
if (res.headersSent) {
|
||
logger.warn("尝试发送响应但响应头已发送");
|
||
return false;
|
||
}
|
||
|
||
try {
|
||
if (isJson) {
|
||
res.json(data);
|
||
} else {
|
||
res.send(data);
|
||
}
|
||
return true;
|
||
} catch (error) {
|
||
logger.error("发送响应失败:", error);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 发送成功响应
|
||
* @param {Object} res - Express响应对象
|
||
* @param {*} data - 成功数据
|
||
* @param {string} message - 成功消息
|
||
*/
|
||
function sendSuccess(res, data = null, message = "请求成功") {
|
||
return safeSend(res, {
|
||
success: true,
|
||
message,
|
||
data
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 发送错误响应
|
||
* @param {Object} res - Express响应对象
|
||
* @param {string} message - 错误消息
|
||
* @param {*} error - 错误详情
|
||
* @param {number} status - HTTP状态码
|
||
*/
|
||
function sendError(res, message = "请求失败!", error = null, status = 400) {
|
||
if (!res.headersSent) {
|
||
res.status(status);
|
||
}
|
||
|
||
return safeSend(res, {
|
||
success: false,
|
||
message,
|
||
error
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 包装异步路由处理器,自动处理错误
|
||
* @param {Function} fn - 异步路由处理函数
|
||
* @returns {Function} - 包装后的处理函数
|
||
*/
|
||
function asyncHandler(fn) {
|
||
return (req, res, next) => {
|
||
Promise.resolve(fn(req, res, next)).catch(error => {
|
||
logger.error("异步路由错误:", error);
|
||
if (!res.headersSent) {
|
||
sendError(res, "服务器内部错误",
|
||
error && error.message ? error.message : '',
|
||
500
|
||
);
|
||
}
|
||
});
|
||
};
|
||
}
|
||
|
||
module.exports = {
|
||
safeSend,
|
||
sendSuccess,
|
||
sendError,
|
||
asyncHandler
|
||
};
|