Maison > Questions et réponses > le corps du texte
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粉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.