suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Geben Sie die Ergebnisse der MySQL2-Abfrage stark in Typescript ein

Ich entwickle eine Anwendung mit NextJS und Typescript und versuche herauszufinden, wie MySQL-Antworten am besten korrekt eingegeben werden können. Hier ist der API-Endpunkt:

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;

Ich möchte dringend insertId über ESLint tippen, um alle Warnungen und Fehler zu entfernen, aber leider waren alle meine Bemühungen erfolglos. Die Fehlermeldung, die ich erhalte, ist:

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

Meine executeQuery Funktion ist definiert als:

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

Einer meiner Implementierungsversuche ist diese SO-Antwort, aber ich schaffe es nicht, sie zum Laufen zu bringen...

Jede Hilfe ist uns sehr dankbar!

P粉342101652P粉342101652387 Tage vor430

Antworte allen(1)Ich werde antworten

  • P粉489081732

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

    我也遇到了和你一样的问题,在查找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 美分,希望它对将来的人有所帮助。

    Antwort
    0
  • StornierenAntwort