簡體   English   中英

mysql2 模塊中的類型 ... OkPacket 上不存在屬性“長度”

[英]Property 'length' does not exists on type ... OkPacket in mysql2 module

我有與此類似的代碼 - 非常簡單,只是為了展示案例。

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[]'. error TS2339: Property 'length' does not exist on type 'RowDataPacket[] | RowDataPacket[][] | OkPacket | OkPacket[]'.

我找不到任何方法將 OkPacket 重新定義為至少有length?: number足以忽略該錯誤的數字(大多數選擇無論如何都不會得到 OkPackets,如果我得到的不是,我不想檢查每個選擇的類型OkPacket 當我知道它不是)...

我也找不到合適的方法來處理這個問題,所以最后針對我的類似情況采用了這種解決方法:

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");

您還可以使用用戶定義的 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;
}

我也討厭這個錯誤。 這是我的解決方法:

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

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

我也不喜歡這方面的設計選擇,但我通常使用:

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

我遇到了類似的問題,並且能夠通過檢查查詢的結果行是否為數組來修復 TypeScript 給出的警告,“類型 'OkPacket' 上不存在屬性 'length'”。 這對我來說比使用 JSON.stringify() 將行轉換為字符串要容易得多。

使用上面的原始示例,我將 result.length 比較更改為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM