服务器返回JSON解析错误:SyntaxError问题排查求助
问题排查:DELETE接口404导致JSON解析失败
问题现象
- 测试运行时抛出错误:
SyntaxError: Unexpected token < in JSON at position 0 at JSON.parse (<anonymous>) - API客户端调用该接口返回:
Cannot DELETE /v1/admin/quiz/trash/empty - 服务器日志记录:
DELETE /v1/admin/quiz/trash/empty?token=4017954885&quizids=%5B216893084358531%2C316893084359311%5D 404 0.283 ms - 167
相关代码
server.ts 路由定义
app.delete('v1/admin/quiz/trash/empty', (req: Request, res: Response) => { const token = req.query.token as string; console.log(req.query.quizids); const quizids = JSON.parse(req.query.quizids as string) as number[]; const response = adminTrashEmptyV1(token, quizids); if ('error' in response) { if (response.error === 'Token is not a valid structure.') { res.status(401); } else if (response.error === 'Provided token is valid structure, but is not for a currently logged in session.') { res.status(403); } else { res.status(400); } } return res.json(response); });
requests.ts 请求封装代码
import request, { HttpVerb, Options } from 'sync-request'; import { port, url } from '../src/config.json'; const SERVER_URL = `${url}:${port}`; function createRequest(method: HttpVerb, path: string, data: object) { let content: Options; if (method === 'PUT' || method === 'POST') { content = { json: data }; } else { content = { qs: data }; } const res = request( method, SERVER_URL + path, content ); return { body: JSON.parse(res.body.toString()), statusCode: res.statusCode }; } // clear export function requestClear() { return createRequest('DELETE', '/v1/clear', { }); } export function requestTrashDelete(token: string, quizids: number[]) { return createRequest('DELETE', `/v1/admin/quiz/trash/empty`, { token: token, quizids: JSON.stringify (quizids) }); }
问题根源
- 路由匹配失败导致404:Express框架中,路由路径必须以斜杠
/开头,而server.ts里的路由定义缺少开头的斜杠,导致无法匹配请求的/v1/admin/quiz/trash/empty路径,服务器返回404状态码及对应的HTML错误页面。 - JSON解析错误:测试代码的
createRequest函数默认将所有响应体当作JSON解析,但404返回的HTML页面以<开头,不符合JSON格式,因此抛出语法错误。
修复方案
修改server.ts中的路由定义,在路径前添加斜杠:
app.delete('/v1/admin/quiz/trash/empty', (req: Request, res: Response) => { // 原有业务逻辑保持不变 });
重启服务器后重新运行测试或调用API,此时路由能正确匹配,返回JSON格式响应,JSON解析错误将消失。
内容的提问来源于stack exchange,提问作者naufalafels
相关产品推荐
相关产品推荐

