在Typescript中强类型化mysql2的查询结果
P粉342101652
P粉342101652 2023-12-31 13:46:28
0
1
388

我正在使用 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 响应,但我无法让它工作......

非常感谢任何和所有帮助!

P粉342101652
P粉342101652

全部回复(1)
P粉489081732

我也遇到了和你一样的问题,在查找mysql2类型文件后,我发现你可以传递查询的结果类型。

例如:

connection.query('INSERT INTO posts SET ?', {title: 'test'},
function (error, results, fields) {
  if (error) throw error;
  console.log(results.insertId);
});

对于插入和更新,您可以使用 OkPacket 类型,对于选择,您可以使用 RowDataPacket 类型。您可以通过将 RowDataPacket 实现为查询的预期响应类型并将其传递到查询函数中来进一步键入它。

例如:

export interface Post {
  title: string;
}

export interface PostRow extends RowDataPacket, Post {}

那么在查询的时候就可以这样传递:

connection.query('SELECT * FROM posts WHERE id = 1',
function (error, results, fields) {
  if (error) throw error;
  // ...
});

这是我的 2 美分,希望它对将来的人有所帮助。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板