如何用Node.js+Express+MySQL实现多SKU删除路由?请求报错
问题分析与解决方案
问题根源
- 路由不匹配:你定义的路由是
/delete/:sku(路径参数模式),但实际请求用的是查询参数/delete?sku=xxx&sku=xxx,Express找不到对应DELETE /delete的路由,因此返回404错误。 - 多SKU传递方式错误:路径参数无法承载多个值,即便调整路径参数格式,也没法一次性传递多个SKU。
- CORS配置重复:同时手动设置CORS响应头和使用
cors()中间件,会导致重复设置响应头,可能引发潜在跨域问题。
修复步骤与代码示例
1. 调整路由逻辑,接收查询参数
将路由改为/delete,通过request.query.sku获取多个SKU值。Express中,当查询参数存在多个同名键(如?sku=a&sku=b)时,request.query.sku会自动转为数组;若只有单个值则为字符串,需统一处理为数组格式。
2. 正确适配SQL的IN子句
MySQL的IN子句支持数组作为参数,直接将数组传递给connection.query即可,它会自动转换为('val1', 'val2')的合法格式。
3. 清理重复的CORS配置
保留cors()中间件即可,它会自动处理跨域相关响应头,无需手动重复设置。
修改后的完整代码:
import express from 'express'; import { pool } from './mysql'; import cors from 'cors'; import { config } from 'dotenv'; config(); const app = express(); app.use(express.json()); // 仅保留cors中间件处理跨域 app.use(cors()); app.delete('/delete', (request: any, response: any) => { // 统一处理查询参数为数组格式 let skus = request.query.sku; if (!skus) { return response.status(400).json({ error: '未提供SKU参数' }); } if (!Array.isArray(skus)) { skus = [skus]; } pool.getConnection((err: any, connection: any) => { if (err) { return response.status(500).json({ error: '获取数据库连接失败' }); } connection.query( 'DELETE FROM products WHERE sku IN (?)', [skus], (error: any, result: any) => { connection.release(); if (error) { return response.status(400).json({ error: error.message }); } response.status(200).json({ success: true, deletedRows: result.affectedRows }); } ); }); }); app.listen(4000, () => { console.log('服务器运行在端口4000'); });
测试请求
在Postman中发送DELETE请求到:
localhost:4000/delete?sku=JVC200123&sku=JVC200124
此时会正确匹配路由,删除对应SKU的商品,并返回包含删除行数的成功响应。
额外注意事项
- 增加参数校验:检查SKUs是否为空,避免执行
DELETE FROM products WHERE sku IN ()这类无效SQL。 - 优化错误处理:数据库连接失败时返回500状态码,同时返回友好的错误信息,而非原始错误堆栈。
内容的提问来源于stack exchange,提问作者Leon Murelli SIlveira
相关产品推荐
相关产品推荐

