Rumah  >  Soal Jawab  >  teks badan

Taip dengan kuat hasil pertanyaan mysql2 dalam Typescript

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粉342101652P粉342101652293 hari yang lalu347

membalas semua(1)saya akan balas

  • P粉489081732

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

    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.

    balas
    0
  • Batalbalas