You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:44:57