Files
happy-life-star/mini-program/src/services/request.js
T
peanut 76403a4ad1 feat(mini-program): 添加 request.js API 请求诊断日志
- 在 request() 函数中添加请求/响应/错误日志
- 输出完整 URL、状态码、错误信息
- 仅在 DEBUG=true 时打印
2026-03-18 22:57:00 +08:00

135 lines
3.1 KiB
JavaScript

import { getEnvValue, isDev } from '../config/env.js'
const API_BASE_URL = getEnvValue('API_BASE_URL')
/**
* 请求拦截处理
* 自动添加 token 到请求头
*/
const getHeaders = () => {
const token = uni.getStorageSync('access_token')
const headers = {
'Content-Type': 'application/json'
}
if (token) {
headers.Authorization = `Bearer ${token}`
}
return headers
}
/**
* 统一请求方法
* @param {Object} options - 请求配置
* @returns {Promise} 请求 Promise
*/
const request = (options) => {
const debug = getEnvValue('DEBUG')
const fullUrl = `${API_BASE_URL}${options.url}`
// 请求日志
if (debug) {
console.log('[API Request]', {
method: options.method || 'GET',
url: fullUrl,
path: options.url,
env: import.meta.env.VITE_APP_ENV
})
}
return new Promise((resolve, reject) => {
uni.request({
url: fullUrl,
method: options.method || 'GET',
data: options.data,
header: getHeaders(),
timeout: 30000,
success: (res) => {
const { data, statusCode } = res
// 响应日志
if (debug) {
console.log('[API Response]', {
path: options.url,
status: statusCode,
code: data?.code,
success: data?.code === 200 || data?.code === 0
})
}
// 处理 401 未授权
if (statusCode === 401) {
uni.removeStorageSync('access_token')
uni.removeStorageSync('refresh_token')
uni.redirectTo({ url: '/pages/login/index' })
reject(new Error('登录已过期,请重新登录'))
return
}
// 后端返回格式:{ code, message, data }
if (data.code === 200 || data.code === 0) {
resolve(data)
} else {
reject(new Error(data.message || '请求失败'))
}
},
fail: (err) => {
// 错误日志
if (debug) {
console.error('[API Error]', {
path: options.url,
error: err.errMsg,
env: import.meta.env.VITE_APP_ENV
})
}
reject(new Error(err.errMsg || '网络错误'))
}
})
})
}
/**
* GET 请求
*/
export const get = (url, params = {}) => {
// 构建查询字符串
const queryString = Object.keys(params)
.map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
.join('&')
const fullUrl = queryString ? `${url}?${queryString}` : url
return request({ url: fullUrl, method: 'GET' })
}
/**
* POST 请求
*/
export const post = (url, data = {}) => {
return request({ url, method: 'POST', data })
}
/**
* PUT 请求
*/
export const put = (url, data = {}) => {
return request({ url, method: 'PUT', data })
}
/**
* DELETE 请求
*/
export const del = (url, params = {}) => {
const queryString = Object.keys(params)
.map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
.join('&')
const fullUrl = queryString ? `${url}?${queryString}` : url
return request({ url: fullUrl, method: 'DELETE' })
}
export default {
get,
post,
put,
del
}