Taip dengan kuat hasil pertanyaan mysql2 dalam Typescript
P粉342101652
P粉342101652 2023-12-31 13:46:28
0
1
342

Saya sedang membangunkan aplikasi menggunakan NextJS dan Typescript dan cuba menentukan cara terbaik untuk menaip respons MySQL dengan betul. Berikut ialah titik akhir 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;

Saya ingin menaip dengan kuat insertId melalui ESLint untuk membuang semua amaran dan ralat, tetapi malangnya, semua usaha saya tidak berjaya. Ralat yang saya terima ialah:

Property 'insertId' does not exist on type 'RowDataPacket[] | RowDataPacket[][] | OkPacket | OkPacket[] | ResultSetHeader | { error: unknown; }'.
  Property 'insertId' does not exist on type 'RowDataPacket[]'.ts(2339)

Fungsi executeQuery saya ditakrifkan sebagai:

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 };
  }
};

Salah satu percubaan saya dalam pelaksanaan ialah tindak balas SO ini, tetapi saya tidak dapat melaksanakannya...

Sebarang dan semua bantuan amat dihargai!

P粉342101652
P粉342101652

membalas semua(1)
P粉489081732

Saya juga mengalami masalah yang sama seperti anda Selepas mencari fail jenis mysql2, saya mendapati anda boleh lulus jenis hasil pertanyaan.

Contohnya:

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

Untuk sisipan dan kemas kini, anda boleh terus menaipnya menggunakan OkPacket 类型,对于选择,您可以使用 RowDataPacket 类型。您可以通过将 RowDataPacket dengan melaksanakan jenis respons yang dijangkakan untuk pertanyaan dan menghantarnya ke dalam fungsi pertanyaan.

Contohnya:

export interface Post {
  title: string;
}

export interface PostRow extends RowDataPacket, Post {}

Kemudian anda boleh menyampaikannya seperti ini apabila bertanya:

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

Ini 2 sen saya, harap ia membantu seseorang pada masa hadapan.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!