我在类型记录中使用mysql2 2/答应库,但是,我无法理解查询方法返回的类型,也无法解决错误。
我的密码在下面。
import * as mysql from "mysql2/promise";
let mysql_connection: mysql.Connection = await mysql.createConnection({
//Some options here.
});
let backend_mysql_res: [(mysql.RowDataPacket[][] | mysql.RowDataPacket[] | mysql.OkPacket | mysql.OkPacket[] | mysql.ResultSetHeader), mysql.FieldPacket[]] = await mysql_connection.query(`SELECT * FROM data.table ORDER BY time DESC LIMIT 1`);
//The error occurred this line.
console.log(backend_mysql_res[0][0]);上面代码的最后一行中有关backend_mysql_res[0][0]的错误消息如下所示。
TS7053: Element implicitly has an 'any' type because expression of type '0' can't be used to index type 'RowDataPacket[] | RowDataPacket[][] | OkPacket | OkPacket[] | ResultSetHeader'. Property '0' does not exist on type 'RowDataPacket[] | RowDataPacket[][] | OkPacket | OkPacket[] | ResultSetHeader'.上面的错误消息描述了type '0',但是,type '0'是什么?这个型号不是吗?
所以,我找不到解决问题的办法。
mysql2 2/诺言查询方法的正确响应类型是什么?此外,let backend_mysql_res ...的上述类型规范是我根据IDE的建议编写的。但我觉得这有点太长了。那么,有什么方法可以提高代码的复杂度吗?
这些天我刚开始学打字稿。
任何能帮我的人。
发布于 2022-05-30 11:19:33
我正在使用自定义函数。不确定这是否是您正在寻找的解决方案,但它确实适用于单个查询。仍在处理多个查询支持。
首先,我为mysql连接查询创建了一个包装器。我们可以在下面的打字稿中找到。现在,可能有一个更好的方法,所以可以建议对此进行编辑。
import {
createPool
} from "mysql2/promise";
var pool = createPool({
waitForConnections: true,
connectionLimit: 10,
host: process.env.DBHOST,
port: parseInt(process.env.DBPORT),
user: process.env.DBUSER,
password: process.env.DBPASSWORD,
database: process.env.DB_NAME,
multipleStatements: true,
connectTimeout: 30000,
});
export const fireQuery = async <
T extends RowDataPacket[][] | RowDataPacket[] | OkPacket | OkPacket[] | ResultSetHeader > (QUERY: string, PARAMS: any[] = []): Promise < T extends RowDataPacket[][] | RowDataPacket[] | OkPacket | OkPacket[] | ResultSetHeader ? T : RowDataPacket[][] | RowDataPacket[] | OkPacket | OkPacket[] | ResultSetHeader > => {
const connection = await pool.getConnection();
try {
console.log("starting transaction...", QUERY, PARAMS);
await connection.beginTransaction();
console.log("running query...");
let queryResult = await connection.query <
T extends |
OkPacket |
ResultSetHeader |
RowDataPacket[] |
RowDataPacket[][] |
OkPacket[] ?
T : OkPacket | ResultSetHeader | RowDataPacket[] | RowDataPacket[][] | OkPacket[] > (QUERY, PARAMS);
console.log("committing transaction...");
await connection.commit();
console.log("transaction committed.");
return queryResult[0];
} catch (error) {
Sentry.captureException(error);
connection.rollback();
console.error("an error occurred:", error);
throw error;
} finally {
connection.release();
}
};
如下所示。
用于单次查询
export interface ISelectQueryInterface extends RowDataPacket {
col1: string;
col2: number;
col3: boolean;
}
const getUserResult = await fireQuery<UserRDataType[]>("select col1, col2, col3 from table where mobileNo = ?", [data.mobileNo])
对于多个查询,这有点麻烦,因为我们首先为任何查询定义数据类型,然后为用例提供模式。
export interface ISelectQueryInterface1 extends RowDataPacket {
col1: string;
col2: number;
col3: boolean;
}
export interface ISelectQueryInterface2 extends RowDataPacket {
col4: string;
col5: number;
col6: boolean;
}
export interface ISelectQueryInterface3 extends RowDataPacket {
col7: string;
col8: number;
}
const output: [ISelectQueryInterface1[], ISelectQueryInterface2[], ISelectQueryInterface3[]] = await fireQuery<any>("select col1, col2, col3 from table where mobileNo = ?;select col4, col5, col6 from table where email = ?;select col7, col8 from table;", ["1234567890", "abcd@gmail.com"]);
发布于 2022-05-05 20:54:10
它可能不是最好的解决方案,但是您可以使用:
let backend_mysql_res: any = await mysql_connection.query(`SELECT * FROM data.table ORDER BY time DESC LIMIT 1`);这样你就可以访问你需要的字段了。使用:
console.log(backend_mysql_res)看看结果。
https://stackoverflow.com/questions/71702563
复制相似问题