首頁  >  問答  >  主體

在Typescript中強類型化mysql2的查詢結果

我正在使用 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粉342101652P粉342101652293 天前349

全部回覆(1)我來回復

  • P粉489081732

    P粉4890817322024-01-01 11:02:07

    我也遇到了和你一樣的問題,在尋找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 美分,希望它對將來的人有所幫助。

    回覆
    0
  • 取消回覆