非计算机专业如何转行后端开发 – 数据库连接配置与异常处理实践

环境准备与依赖安装

首先,确保你的开发环境已安装Node.js和npm。以官方文档为准,Node.js v18.x及以上版本推荐用于最新版本的Express框架。

使用以下命令安装Express和MySQL2(以MySQL数据库为例):

npm init -y
npm install express mysql2

MySQL2是Node.js连接MySQL数据库的常用驱动,官方文档确认其支持Promise API,便于异步操作。

创建基础Express应用

创建`index.js`文件,初始化一个简单的Express服务器。

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}`);
});

这段代码启动了一个监听3000端口的HTTP服务器,响应根路径的GET请求。

配置数据库连接

在项目中创建`config.js`文件,配置数据库连接。

const mysql = require('mysql2');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'your_password',
  database: 'your_database'
});

connection.connect(err => {
  if (err) {
    console.error('Error connecting to the database:', err.stack);
    return;
  }
  console.log('Connected to the database.');
});

module.exports = connection;

请替换`your_password`和`your_database`为实际值。`createConnection`方法创建一个数据库连接,`connect`方法执行连接操作。

实现数据库查询接口

修改`index.js`,添加一个查询数据库的接口。

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

app.get('/users', async (req, res) => {
  try {
    const [rows, fields] = await db.query('SELECT id, name FROM users');
    res.json(rows);
  } catch (error) {
    console.error('Database query error:', error);
    res.status(500).send('Internal Server Error');
  }
});

`db.query`返回一个包含结果集和字段的数组。使用`async/await`处理异步操作,`try/catch`捕获异常。

处理常见数据库连接错误

修改`config.js`,增加错误处理逻辑。

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

const connection = mysql.createPool({
  host: 'localhost',
  user: 'root',
  password: 'your_password',
  database: 'your_database',
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
});

async function getDatabaseConnection() {
  try {
    const connection = await this.getConnection();
    return connection;
  } catch (error) {
    console.error('Error getting database connection:', error);
    throw error;
  }
}

module.exports = { getDatabaseConnection };

`mysql.createPool`创建一个连接池,提高性能。`getDatabaseConnection`函数封装了获取连接的逻辑,增加了错误处理。

处理查询结果为空的情况

修改`index.js`中的`/users`接口,处理查询结果为空的情况。

app.get('/users', async (req, res) => {
  try {
    const [rows, fields] = await db.query('SELECT id, name FROM users');
    if (rows.length === 0) {
      return res.status(404).send('No users found');
    }
    res.json(rows);
  } catch (error) {
    console.error('Database query error:', error);
    res.status(500).send('Internal Server Error');
  }
});

检查`rows.length`,如果为0,返回404状态码。

处理SQL语法错误

在`/users`接口中故意输入错误SQL语句,观察错误处理。

app.get('/users', async (req, res) => {
  try {
    const [rows, fields] = await db.query('SELECT id, name FROM userrs'); // Intentional typo
    if (rows.length === 0) {
      return res.status(404).send('No users found');
    }
    res.json(rows);
  } catch (error) {
    console.error('Database query error:', error);
    res.status(500).send('Internal Server Error');
  }
});

控制台将输出错误信息,响应500状态码。根据错误信息,修正SQL语句。

关闭数据库连接

在应用程序关闭时,关闭数据库连接池。

process.on('exit', async () => {
  await connection.end();
  console.log('Database connection closed.');
});

process.on('SIGINT', async () => {
  await connection.end();
  console.log('Database connection closed on SIGINT.');
});

监听`exit`和`SIGINT`事件,确保在程序退出时关闭连接。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。