我正在使用 NextJS 和 Typescript 开发一个应用程序,并尝试确定正确键入 MySQL 响应的最佳方法。这是 API 端点:
import { hash } from "bcrypt"; import type { NextApiRequest, NextApiResponse } from "next"; import randomstring from "randomstring"; import { executeQuery } from "../../../lib/db"; const Test = async (req: NextApiRequest, res: NextApiResponse) => { // Manage password generation const password = randomstring.generate(16); const hashedPassword = hash(password, 10); // Create new auth using email and password const auth = await executeQuery( "INSERT INTO auth (email, password) VALUES (?, ?)", ["test@test.com", (await hashedPassword).toString()] ); res.statusCode = 200; res.json(auth.insertId); }; export default Test;
我想强类型 insertId
通过 ESLint 删除所有警告和错误,但不幸的是,我所做的一切努力都没有成功。我收到的错误是:
Property 'insertId' does not exist on type 'RowDataPacket[] | RowDataPacket[][] | OkPacket | OkPacket[] | ResultSetHeader | { error: unknown; }'. Property 'insertId' does not exist on type 'RowDataPacket[]'.ts(2339)
我的executeQuery
函数定义为:
import mysql from "mysql2/promise"; export const executeQuery = async (query: string, params: unknown[] = []) => { try { const db = await mysql.createConnection({ host: process.env.MYSQL_HOST, database: process.env.MYSQL_DATABASE, user: process.env.MYSQL_USER, password: process.env.MYSQL_PASSWORD, }); const [results] = await db.execute(query, params); db.end(); return results; } catch (error) { return { error }; } };
我的实现尝试之一是这个 SO 响应,但我无法让它工作......
非常感谢任何和所有帮助!
我也遇到了和你一样的问题,在查找mysql2类型文件后,我发现你可以传递查询的结果类型。
例如:
对于插入和更新,您可以使用
OkPacket
类型,对于选择,您可以使用RowDataPacket
类型。您可以通过将RowDataPacket
实现为查询的预期响应类型并将其传递到查询函数中来进一步键入它。例如:
那么在查询的时候就可以这样传递:
这是我的 2 美分,希望它对将来的人有所帮助。