
环境准备与依赖安装
首先,确保你的开发环境已安装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`事件,确保在程序退出时关闭连接。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。