Rumah > Soal Jawab > teks badan
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粉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.