如何使用Node js + Express + MySQL为多个项目创建删除路由?

rm5edbpk  于 2023-11-16  发布在  Mysql
关注(0)|答案(2)|浏览(111)

试图删除一组项目来自客户端的sku代码。

import express from 'express';
import { pool } from './mysql';
import cors from 'cors';
import { config } from 'dotenv';

config();
const app = express();
app.use(express.json());

app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    res.header("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, OPTIONS");
    next();
})

app.use(cors());

app.delete('/delete/:sku', (request:any, response:any) => {
    const sku = request.params.sku;
    pool.getConnection((err:any, connection:any) => {
        
        connection.query(
            'DELETE FROM products WHERE sku IN (?)',
            [sku],
            (error:any, result:any, fields:any) => {
                connection.release();
                if (error) {
                    return response.status(400).json(error)
                }
                response.status(200).json({success: true});
            }
            )
        })
    });

app.listen(4000);

字符串
mysql.ts文件是为其他路由工作,但我可以编辑它,如果有人认为这是必要的。
Postman 发来了这个:

localhost:4000/delete?sku=JVC200123&sku=JVC200124


并接收这个:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <title>Error</title>
</head>

<body>
    <pre>Cannot DELETE /delete</pre>
</body>

</html>


所有其他 Postman 的要求工作没有http://。不知道哪里是我的错误。

mfpqipee

mfpqipee1#

问题是,在这段代码中,对于快速路由,您有一个错误

app.delete('/delete/:sku', (request:any, response:any) => {
   const sku = request.params.sku;
   ...rest of your code
});

字符串
它应该是:

app.delete('/delete', (request:any, response:any) => {
    const sku = request.query.sku;
   ...rest of your code
});


localhost:4000/delete?sku=JVC200123&sku=JVC200124指向/delete而不是/delete/:sku路由。因此,在您的情况下,:sku路径变量是多余的,因为您希望使用多个项目的查询参数。此外,为了访问查询参数,您需要使用request.query

k2arahey

k2arahey2#

主要问题是request.params引用了路由的 path 部分。
request.query是你想要的。
request.query可以返回一个字符串、未定义或数组。在每种情况下都需要一个数组,可以是空数组(没有传入任何内容)、一个元素的数组(request.query是一个字符串)或多个字符串的数组(发送了一个格式为/delete?sku=AAAA&sku=BBBB&sku=CCCC的请求)
因此,你需要一个helper函数来规范化输入:

const normalizeToArray = (inputValue: any): string[] => {
    let r: string[] = [];
    if (typeof inputValue === "string") {
        r.push(inputValue)
    }
    if (Array.isArray(inputValue)) {
        r = inputValue;
    }
    return r;
};

字符串
你的快速路线应该是这样的:

app.delete('/delete', (request: express.Request, response: express.Response) => {

    //  ensure that skus is always an array, no matter what gets passed in
    const skus = normalizeToArray( request.query.sku || [] );

    pool.getConnection((err: MysqlError, connection: PoolConnection) => {
        connection.query(
            'DELETE FROM products WHERE sku IN (?)',
            skus,
            (error: any, result: any, fields: any) => {
                connection.release();
                if (error) {
                    return response.status(400).json(error)
                }
                response.status(200).json({ success: true });
            }
        )
    })
});


我强烈建议使用更严格的Typescript类型,它可以在IDE中实现真正有用的兼容性功能。

相关问题