当我的输入应该是 uuid 时,整数类型的输入无效

问题描述 投票:0回答:1

我正在使用我的 API 与我的数据库对话。我的 postgresql 数据库中的 carpools 表包含一列: carpoolid ,其下面有 uuid 。然而,在我的 api 中,它一直给我这个错误:

error: invalid input syntax for type integer: "ddfd9fc4-554b-4840-8a7e-3efb555c90d5"

您看到的字符串应该是我的uuid,但我不知道为什么它说整数类型的输入语法无效。

这是我的路线代码:

app.post('/api/joinGroup/:carpoolid', async (req, res) => {
    const result = joinGroupSchema.validate(req.body);

    if (result.error) {
        return res.status(400).json({ error: result.error.details[0].message });
    }

    const carpoolID = req.params.carpoolid.toLowerCase() // No conversion here yet
    const firebaseUserID = req.body.firebase_user_id;

    console.log('Received carpoolID:', carpoolID);
    console.log('Received firebaseUserID:', firebaseUserID);

    try {
        console.log('Join Group Request Body:', req.body);

        console.log('Carpools:', carpools);

        // Check if carpoolID is null
        if (!carpoolID) {
            console.log('Invalid carpoolID:', carpoolID);
            return res.status(400).json({ error: 'Invalid carpoolID provided.' });
        }

        // Check if the group (carpool) exists
        const groupExists = carpools.some(c => c.carpoolID && c.carpoolID.toLowerCase() === carpoolID.toLowerCase());
        console.log('Group exists:', groupExists);
        if (!groupExists) {
            console.log('Group does not exist:', carpoolID);
            return res.status(404).json({ error: 'The group with the given ID was not found.' });
        }

        // Check if the user is already a member of the group
        const userExistsInGroup = await db.query('SELECT 1 FROM user_carpools WHERE firebase_user_id = $1 AND carpool_id = $2', [firebaseUserID, carpoolID.toLowerCase()]);
        console.log('User exists in group:', userExistsInGroup.rows.length > 0);
        if (userExistsInGroup.rows.length > 0) {
            console.log('User is already a member of the group:', firebaseUserID, carpoolID);
            return res.status(400).json({ error: 'User is already a member of the group.' });
        }

        // Add user to the group
        const addUserToGroupQuery = 'INSERT INTO user_carpools(firebase_user_id, carpool_id) VALUES ($1, $2)';
        await db.query(addUserToGroupQuery, [firebaseUserID, carpoolID]);

        console.log('User added to the group successfully:', firebaseUserID, carpoolID);
        return res.status(200).json({ message: 'User added to the group successfully' });
    } catch (err) {
        console.error(err);
        return res.status(500).json({ error: 'Internal Server Error' });
    }
});

这是我的加入组架构:

const joinGroupSchema = Joi.object({
    carpoolid: Joi.string().required(),
    firebase_user_id: Joi.string().required(),
});

终端中的 console.logs 显示了 firebaseuserid 和 carpoolid:

Received carpoolID: DDFD9FC4-554B-4840-8A7E-3EFB555C90D5
Received firebaseUserID: 4wStZ584luP41EqIzrBAEkgV58i1

这意味着它可以从我的快速代码中正确接收它,但我认为无法转换它。但是我不确定,因此非常感谢任何帮助,非常感谢!

javascript node.js express uuid
1个回答
0
投票

这可能是由于您的路线中 carpoolid 参数处理不正确。在您的路线定义中,您使用 req.params.carpoolid 来访问 carpoolid 参数,如果您的 URL 类似于 /api/joinGroup/ddfd9fc4-554b-4840-8a7e-3efb555c90d5,则该参数应该是正确的。但是,错误消息表明它正在尝试将 carpoolid 解释为整数。发生这种情况的原因可能是数据库查询中 carpoolid 参数的数据类型。确保数据库表中的 carpool_id 正确定义为 uuid 类型。
由于您使用的是 PostgreSQL,因此可以通过检查表定义中的列类型来强制执行此操作。

CREATE TABLE carpools (
    carpool_id UUID PRIMARY KEY,
    -- other columns
);

还要确保您的 Node.js PostgreSQL 驱动程序正确处理 UUID。某些驱动程序可能无法自动正确解析 UUID,因此您可能需要在执行查询时将参数类型显式指定为 UUID。

const addUserToGroupQuery = 'INSERT INTO user_carpools(firebase_user_id, carpool_id) VALUES ($1, $2::uuid)'
await db.query(addUserToGroupQuery, [firebaseUserID, carpoolID])

将 carpoolID 参数插入数据库时,应将其显式转换为 UUID。这可能会解决 PostgreSQL 尝试将其解释为整数的问题。如果需要,请确保使其适应您特定的 PostgreSQL 驱动程序的语法。

还要确保您的拼车数组也填充了正确的 UUID,因为您正在使用它来检查组是否存在。如果 carpoolID 未在此数组中存储为 UUID,您可能会遇到区分大小写或类型转换的问题。

© www.soinside.com 2019 - 2024. All rights reserved.