在Typescript中強類型化mysql2的查詢結果
P粉342101652
P粉342101652 2023-12-31 13:46:28
0
1
389

我正在使用 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 美分,希望它對將來的人有所幫助。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板