NodeJS 类型上不存在属性“length”. mysql2模块中的OkPacket

laik7k3q  于 2023-10-17  发布在  Node.js
关注(0)|答案(5)|浏览(243)

我有类似的代码-非常简单,只是为了显示情况。

this.getCode = (code: string): Promise<codeObject | false> => {
        return new Promise((resolve, reject) => {
            pool.query('SELECT * FROM ?? WHERE code = ?', [TABLE, code], function (err, result) {
                if (err) {
                    return reject(err);
                }

                if (result.length === 0) {
                    return resolve(false);
                }
            });
        });
    };

问题在第行if(result.length === 0){,错误为error TS2339: Property 'length' does not exist on type 'RowDataPacket[] | RowDataPacket[][] | OkPacket | OkPacket[]'.
我找不到任何方法来重新定义OkPacket,至少有length?: number,这将是足够的忽略该错误(大多数选择不得到OkPackets无论如何,我不想检查类型的每一个选择,如果我得到的不是OkPacket时,我知道它不是).

r7s23pms

r7s23pms1#

我遇到了类似的问题,并且能够修复TypeScript给出的警告,“Property 'length' does not exist on type 'OkPacket'”,方法是检查查询的结果行是否是数组。这比用JSON.stringify()将行转换为字符串要容易得多。
使用上面的原始示例,我将结果.length比较改为:

if (Array.isArray(result) && result.length === 0) {
   return resolve(false);
}
hpxqektj

hpxqektj2#

我也找不到一个合适的方法来处理这个问题,所以最后我用这个方法来解决我的类似情况:

const [rows,] = await connection.execute("SELECT id FROM users WHERE email = ?", [profile.email]);
if ((rows as any).length === 1) {
   return (rows as any)[0].id;
}
logger.error("Unexpected query response", rows);
throw Error("This code should never be executed");

也可以使用user defined type-guards。就像这样:

const isRowDataPacket = (rows: RowDataPacket[] | RowDataPacket[][] | OkPacket | OkPacket[] | ResultSetHeader): rows is RowDataPacket[] | RowDataPacket[][] => {
    return (rows as RowDataPacket[] | RowDataPacket[][]).length !== undefined
}

但是,您仍然需要进一步进行类型转换以正确解释每行:

const [rows,] = await connection.execute("SELECT id FROM users WHERE email = ?", [profile.email]);
if (isRowDataPacket(rows) && rows.length === 1) {
    return (rows[0] as { id: string }).id;
}
4bbkushb

4bbkushb3#

我也讨厌这个错误。这是我的工作方法:

const [rows] = await db.query(`mySqlHere`);
let tempResult: any = rows;

console.log(tempResult.length); // OK
yuvru6vn

yuvru6vn4#

我也不喜欢这上面的设计选择,但我通常用途:

const [rows, fields] = await conn.execute(QUERY_STRING) as any
console.log(rows.length)
iecba09b

iecba09b5#

对于我自己的用例,map没有在OkPacket中定义,因为我需要以下内容

function (error, results, fields) {

            const data = results.map(() => {
                //... do stuffs..
                return {
                    name: item.name,
                    username: item.username,
                    image: item.image,
                    bio: item.bio,
                    url: item.url,
                }
            })
            resolve([results, fields]);
}

为了消除这个错误,我最终检查了结果对象中是否存在map,如果不存在,就提前返回(仅仅reject()不能修复这个错误)。修改代码如下

function (error, results, fields) {
            if(!('map' in results)) {
                reject(results);
                return;
            }
            const data = results.map((item) => {
                // ...do stuff...
                return {
                    name: item.name,
                    username: item.username,
                    image: item.image,
                    bio: item.bio,
                    url: item.url,
                }
            })
            resolve([results, fields]);
}

对于您的情况,您可以检查length,例如,如果它不存在,则提前返回。

if(!('length' in results)) {
     reject(results);
     return;
}

相关问题