ai-要約を取得 文章摘要

复习 promise 的概念和用法

今天、复习了promise的概念,而复习的过程中,重新认识了 try .. catch 工具的语法。

try...catchPromise 都是用于处理错误的工具,但它们的作用和使用场景略有不同。它们之间是有关系的,特别是在处理异步代码时,try...catch 可以与 Promise 结合使用,提供更强大的错误处理能力。

区别:

  1. try…catch:主要用于捕获同步代码中的错误。当一个同步操作抛出错误时,try...catch 可以捕获并处理。
  2. Promise:主要用于处理异步操作的结果和错误。它提供了 .catch() 方法来处理 Promise 被拒绝时的错误。

关系:

Promisetry...catch 可以结合使用,尤其是在异步代码中。

  • 同步错误try...catch 可以捕获在 Promise 内部同步代码抛出的错误。
  • 异步错误Promise.catch() 方法用于捕获 Promise 内部异步操作的错误。

示例:结合使用 try...catchPromise

1. 在 async 函数中使用 try…catch 捕获 Promise 错误

当使用 async/await 来处理 Promise 时,try...catch 可以用来捕获 Promise 中的错误。

async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error('网络请求失败');
}
const data = await response.json();
console.log(data);
} catch (error) {
// 捕获 Promise 异常
console.error('发生错误:', error);
}
}

在这个例子中,await 等待的 fetch 是一个 Promise,如果请求失败或者数据解析出错,catch 块会捕获到错误。

2. 处理同步错误和异步错误

你可以同时捕获同步错误和异步错误:

function riskyFunction() {
throw new Error('同步错误');
}

async function asyncFunction() {
const data = await Promise.reject('异步错误');
return data;
}

try {
riskyFunction(); // 捕获同步错误
} catch (error) {
console.log('同步错误:', error);
}

async function handleAsync() {
try {
await asyncFunction(); // 捕获异步错误
} catch (error) {
console.log('异步错误:', error);
}
}

handleAsync();

在这个例子中,try...catch 捕获了同步错误 riskyFunction() 中抛出的错误,而异步错误通过 async/awaitcatch 块捕获。

3. 使用 Promise.catch() 处理异步错误

如果没有使用 async/await,你可以通过 .catch() 来处理 Promise 错误:

new Promise((_, reject) => reject('Promise 错误'))
.catch(error => {
console.log('捕获到 Promise 错误:', error);
});

关键点:

  • 同步代码:使用 try...catch 捕获同步代码中的错误。
  • 异步代码:使用 Promise.catch()async/await + try...catch 来捕获异步操作中的错误。

总结:

  • try...catch 是用于捕获同步代码中的错误,与 Promise 的关系体现在异步代码处理上,特别是结合 async/await 使用时。
  • 在异步代码中,Promise 会处理异步操作的错误,而 try...catch 用于捕获和处理同步操作的错误。
  • 如果你在 async 函数中使用 await,你可以使用 try...catch 来捕获 Promise 被拒绝时的错误。

mysql2/promise 中的 Promise 功能

  1. mysql2 库简介
    • mysql2 是一个高性能、轻量级的 Node.js MySQL 客户端库,支持回调和 Promise
    • mysql2/promisemysql2 的一个子模块,专门提供 Promise API
  2. 为什么用 Promise?
    • 数据库查询是异步操作,传统上用回调处理,可能导致「回调地狱」。
    • Promiseasync/await 的方式使代码更简洁、易读,且错误处理更方便。
  3. 作用
    • 将数据库操作封装为 Promise 对象,使查询结果可以通过 .then()await 获取。
    • 如果数据库操作失败,返回一个被拒绝的 Promise,可以用 .catch()try...catch 捕获错误。

代码解析

const mysql = require('mysql2/promise');

const db = mysql.createPool({
host: 'localhost', // 数据库地址
user: 'root', // 数据库用户名
password: 'admin123', // 数据库密码
database: 'shuangzhao_iooio' // 数据库名称
});

module.exports = db;

具体含义:

  1. require(‘mysql2/promise’)
    • 导入 mysql2Promise API 模块,所有数据库操作返回的结果都是 Promise 对象。
  2. mysql.createPool()
    • 创建一个连接池,允许多个数据库查询请求复用连接,提升性能。
    • 返回一个连接池对象 db,这个对象中的方法(如 db.query)都是基于 Promise 的。
  3. 导出 db 对象
    • 你可以在其他文件中引入这个模块,并使用 async/await.then() 的方式进行数据库查询。

如何使用 Promise 的 API 操作数据库

使用 async/await

这是最推荐的方式,代码更加简洁和直观。

const db = require('./path_to_db_file');

async function getUsers() {
try {
const [rows, fields] = await db.query('SELECT * FROM users');
console.log('用户列表:', rows);
} catch (error) {
console.error('查询失败:', error.message);
}
}

getUsers();

使用 .then.catch

如果不想用 async/await,也可以用传统的 Promise 链。

const db = require('./path_to_db_file');

db.query('SELECT * FROM users')
.then(([rows, fields]) => {
console.log('用户列表:', rows);
})
.catch(error => {
console.error('查询失败:', error.message);
});

错误处理

无论是用 async/await 还是 .then/.catch,都可以捕获查询过程中的错误。例如:

  1. 数据库连接失败:如果连接信息(如 hostuserpassword)不正确,Promise 会被拒绝。
  2. SQL 查询语法错误:如果执行的 SQL 查询有语法错误,也会触发错误。

示例:

async function faultyQuery() {
try {
const [result] = await db.query('SELECT * FORM invalid_table'); // SQL 错误
} catch (error) {
console.error('查询出错:', error.message); // 捕获并打印错误
}
}

faultyQuery();

总结

mysql2/promise 中:

  • Promise 让异步数据库操作更加简洁。
  • 通过 async/await.then/.catch 获取查询结果或处理错误。
  • 你的代码中 mysql2/promise 返回的是基于 Promise 的连接池对象 db,后续所有操作都会利用 Promise 的特性进行处理。

这是现代化异步编程的标准方式,非常适合需要频繁与数据库交互的场景。