Maison  >  Questions et réponses  >  le corps du texte

Tapez fortement les résultats de la requête mysql2 dans Typescript

Je développe une application utilisant NextJS et Typescript et j'essaie de déterminer la meilleure façon de saisir correctement les réponses MySQL. Voici le point de terminaison de l'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;

Je souhaite taper fortement insertId via ESLint pour supprimer tous les avertissements et erreurs, mais malheureusement, tous mes efforts ont été infructueux. L'erreur que je reçois est :

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

Ma executeQuery fonction est définie comme :

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

L'une de mes tentatives de mise en œuvre est cette réponse SO, mais je n'arrive pas à la faire fonctionner...

Toute aide est grandement appréciée !

P粉342101652P粉342101652293 Il y a quelques jours340

répondre à tous(1)je répondrai

  • P粉489081732

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

    J'ai également rencontré le même problème que vous. Après avoir recherché le fichier de type mysql2, j'ai découvert que vous pouvez transmettre le type de résultat de la requête.

    Par exemple :

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

    Pour les insertions et les mises à jour, vous pouvez le saisir davantage en utilisant OkPacket 类型,对于选择,您可以使用 RowDataPacket 类型。您可以通过将 RowDataPacket en implémentant le type de réponse attendu pour la requête et en le transmettant à la fonction de requête.

    Par exemple :

    export interface Post {
      title: string;
    }
    
    export interface PostRow extends RowDataPacket, Post {}

    Ensuite, vous pouvez le transmettre comme ceci lors de l'interrogation :

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

    Voici mes 2 cents, j'espère que cela aidera quelqu'un à l'avenir.

    répondre
    0
  • Annulerrépondre