AJAX响应包装器是一种在前端开发中常用的模式,用于统一处理从服务器返回的AJAX响应数据。它通过将原始响应数据封装在一个标准化的结构中,使得前端代码能够以一致的方式处理各种响应情况。
{
"code": 200,
"message": "操作成功",
"data": {
"id": 123,
"name": "示例数据"
}
}
{
"code": 200,
"message": "查询成功",
"data": {
"items": [...],
"total": 100,
"page": 1,
"pageSize": 10
}
}
{
"code": 404,
"message": "资源不存在",
"error": "NOT_FOUND",
"timestamp": "2023-05-20T10:00:00Z"
}
// 封装AJAX请求处理
async function request(url, options = {}) {
try {
const response = await fetch(url, options);
const result = await response.json();
if (result.code !== 200) {
// 统一处理业务错误
throw new Error(result.message || '请求失败');
}
return result.data;
} catch (error) {
// 统一处理网络错误和业务错误
console.error('请求错误:', error.message);
throw error;
}
}
// 使用示例
async function getUserData(userId) {
try {
const user = await request(`/api/users/${userId}`);
console.log('用户数据:', user);
return user;
} catch (error) {
// 错误已在request中统一处理
return null;
}
}
// 响应包装器中间件
function responseWrapper(req, res, next) {
res.success = function(data, message = '操作成功') {
res.json({
code: 200,
message,
data
});
};
res.error = function(code, message, error = null) {
res.status(code).json({
code,
message,
error: error || message
});
};
next();
}
// 使用示例
app.get('/api/users/:id', responseWrapper, async (req, res) => {
try {
const user = await User.findById(req.params.id);
if (!user) {
return res.error(404, '用户不存在');
}
res.success(user);
} catch (err) {
res.error(500, '服务器错误', err.message);
}
});
原因:后端返回的响应结构与前端期望的不一致,可能是字段名不同或结构层级不同。
解决方案:
原因:不同类型的错误(网络错误、业务错误、验证错误)处理方式不一致。
解决方案:
// 统一错误处理
function handleError(error) {
if (error.response) {
// 服务器返回的错误(业务错误)
const { code, message } = error.response.data;
showToast(`${code}: ${message}`);
} else if (error.request) {
// 请求已发出但无响应(网络错误)
showToast('网络连接异常,请检查网络');
} else {
// 其他错误
showToast('发生未知错误');
}
}
原因:不同接口的分页数据格式不一致,导致前端需要为每个接口单独处理。
解决方案:统一分页响应格式,并封装通用分页处理函数:
// 统一分页响应格式
{
"code": 200,
"message": "查询成功",
"data": {
"items": [...],
"pagination": {
"total": 100,
"current": 1,
"pageSize": 10
}
}
}
// 分页处理Hook(React示例)
function usePagination(apiFn) {
const [data, setData] = useState([]);
const [pagination, setPagination] = useState({ current: 1, pageSize: 10 });
const [loading, setLoading] = useState(false);
const fetchData = async (params = {}) => {
setLoading(true);
try {
const result = await apiFn({
...params,
page: pagination.current,
size: pagination.pageSize
});
setData(result.data.items);
setPagination({
...pagination,
total: result.data.pagination.total
});
} finally {
setLoading(false);
}
};
return { data, pagination, loading, fetchData };
}
通过合理设计和实现AJAX响应包装器,可以显著提高前后端协作效率,降低维护成本,并提供更好的用户体验。
没有搜到相关的文章