一、引言
Node.js 是一个强大的 JavaScript 运行环境,允许开发者在服务器端使用 JavaScript 进行编程。它具有高并发、高效的特点,广泛应用于 Web 开发、命令行工具等领域。本文将带您深入了解 Node.js 的安装、基本概念、文件操作、数据库操作以及使用 Express 框架的方法。
二、Node.js 的安装
- 访问 Node.js 官方网站(Node.js — Run JavaScript Everywhere)。
- 选择 “LTS”(长期支持)版本,下载适合您操作系统的安装包。
- 按照安装向导进行安装。安装完成后,在命令行中输入以下命令检查安装是否成功:
node -vnpm -v
如果能正确显示 Node.js 和 npm(Node.js 的包管理器)的版本号,则说明安装成功。
三、Node.js 的基本概念
1.模块系统
- Node.js 使用 CommonJS 模块规范,可将代码分割成多个模块,便于组织和管理。
- 通过
require()
函数引入其他模块,使用module.exports
或exports
对象导出模块功能。 - 例如:
// math.jsfunction add(a, b) {return a + b;}function subtract(a, b) {return a - b;}module.exports = {add,subtract};
// 引入模块const math = require('./math');console.log(math.add(5, 3)); // 输出 8console.log(math.subtract(10, 4)); // 输出 6
2.事件驱动和异步编程:
- Node.js 是事件驱动的,采用异步编程模型处理 I/O 操作,避免阻塞主线程,提高性能和响应速度。
- 可使用回调函数、Promise 或 async/await 处理异步操作结果。
- 回调函数读取文件示例:
const fs = require('fs');fs.readFile('example.txt', 'utf8', (err, data) => {if (err) {console.error(err);} else {console.log(data);}});
Promise 读取文件示例:
const fs = require('fs').promises;fs.readFile('example.txt', 'utf8').then(data => console.log(data)).catch(err => console.error(err));
async/await 读取文件示例:
const fs = require('fs').promises;async function readFileAsync() {try {const data = await fs.readFile('example.txt', 'utf8');console.log(data);} catch (err) {console.error(err);}}readFileAsync();
四、使用 npm 管理项目依赖
- npm 是 Node.js 的包管理器,可轻松安装、管理和共享第三方模块。
- 在项目目录中使用
npm init
命令初始化项目,生成package.json
文件记录项目信息和依赖。 - 使用
npm install
命令安装模块,如npm install express
。安装后模块存于node_modules
目录,并在package.json
中添加依赖信息。 - 使用
npm install --save-dev
安装开发依赖,仅在开发过程中使用,不部署到生产环境。
五、创建简单的 Node.js 应用
1.创建新目录,在其中创建 app.js
文件。
2.编写以下代码:
const http = require('http');const server = http.createServer((req, res) => {res.writeHead(200, { 'Content-Type': 'text/plain' });res.end('Hello, Node.js!');});const port = 3000;server.listen(port, () => {console.log(`Server running at port ${port}`);});
3.在命令行中进入项目目录,运行 node app.js
启动服务器。
4.打开浏览器访问 http://localhost:3000
,可看到 “Hello, Node.js!” 的输出。
案例:简单的时间显示服务器
假设我们要创建一个服务器,当用户访问时,显示当前的时间。以下是实现代码:
const http = require('http');const server = http.createServer((req, res) => {const now = new Date();res.writeHead(200, { 'Content-Type': 'text/plain' });res.end(`Current time is: ${now.toLocaleString()}`);
});const port = 3001;
server.listen(port, () => {console.log(`Time server running at port ${port}`);
});
六、使用 Express 框架
1.安装 Express:
npm install express
2.创建 app.js
文件并引入 Express:
const express = require('express');const app = express();
3.定义路由:
app.get('/', (req, res) => {res.send('Hello, Express!');});
4.启动服务器:
const port = 3000;app.listen(port, () => {console.log(`Server running at port ${port}`);});
访问 http://localhost:3000
可看到输出。
案例:图书管理系统的简单 API
假设我们要创建一个简单的图书管理系统的 API,使用 Express 框架。我们可以定义以下路由:
const express = require('express');
const app = express();// 模拟图书数据
let books = [{ id: 1, title: 'Book 1', author: 'Author 1' },{ id: 2, title: 'Book 2', author: 'Author 2' }
];// 获取所有图书
app.get('/books', (req, res) => {res.json(books);
});// 获取特定图书
app.get('/books/:id', (req, res) => {const book = books.find(b => b.id === parseInt(req.params.id));if (!book) return res.sendStatus(404);res.json(book);
});const port = 3002;
app.listen(port, () => {console.log(`Book API running at port ${port}`);
});
七、处理表单数据
1.安装 body-parser
中间件:
npm install body-parser
2.引入并配置 Express 使用 body-parser
:
const express = require('express');const bodyParser = require('body-parser');const app = express();app.use(bodyParser.urlencoded({ extended: false }));
3.定义路由处理表单提交:
app.post('/submit', (req, res) => {const name = req.body.name;res.send(`Hello, ${name}!`);});
4.创建 HTML 表单提交数据到 /submit
路由。
八、Node.js 中的文件操作
-
读取文件:
- 异步读取:使用
fs.readFile()
。 - 同步读取:使用
fs.readFileSync()
。
- 异步读取:使用
-
写入文件:
- 异步写入:使用
fs.writeFile()
。 - 同步写入:使用
fs.writeFileSync()
。
- 异步写入:使用
-
文件追加内容:
- 异步追加:使用
fs.appendFile()
。 - 同步追加:使用
fs.appendFileSync()
。
- 异步追加:使用
-
检查文件是否存在:
- 同步方法:使用
fs.existsSync()
。 - 异步方法:使用
fs.access()
。
- 同步方法:使用
-
删除文件:
- 异步删除:使用
fs.unlink()
。 - 同步删除:使用
fs.unlinkSync()
。
- 异步删除:使用
-
获取文件信息:
- 异步方法:使用
fs.stat()
。 - 同步方法:使用
fs.statSync()
。
- 异步方法:使用
案例:日志记录器
假设我们要创建一个简单的日志记录器,将应用中的重要事件记录到文件中。以下是实现代码:
const fs = require('fs');function logEvent(message) {const now = new Date();const logMessage = `${now.toLocaleString()} - ${message}\n`;fs.appendFile('log.txt', logMessage, (err) => {if (err) console.error(err);});
}logEvent('Application started');
logEvent('User logged in');
九、Node.js 操作数据库(以 MySQL 为例)
1.安装 mysql2
模块:
npm install mysql2
2.操作数据库示例代码:
const mysql = require('mysql2');// 创建数据库连接const connection = mysql.createConnection({host: 'localhost',user: 'your_username',password: 'your_password',database: 'your_database_name'});// 连接数据库connection.connect((err) => {if (err) {console.error('Error connecting to database:', err);return;}console.log('Connected to database.');});// 插入数据const insertData = { name: 'John', age: 30 };const insertQuery = 'INSERT INTO users (name, age) VALUES (?,?)';connection.query(insertQuery, [insertData.name, insertData.age], (err, results) => {if (err) {console.error('Error inserting data:', err);return;}console.log('Inserted data with id:', results.insertId);});// 查询数据const selectQuery = 'SELECT * FROM users';connection.query(selectQuery, (err, results) => {if (err) {console.error('Error querying data:', err);return;}console.log('Query results:', results);});// 更新数据const updateData = { name: 'Updated John', age: 31, id: 1 };const updateQuery = 'UPDATE users SET name =?, age =? WHERE id =?';connection.query(updateQuery, [updateData.name, updateData.age, updateData.id], (err, results) => {if (err) {console.error('Error updating data:', err);return;}console.log('Updated rows:', results.affectedRows);});// 删除数据const deleteId = 1;const deleteQuery = 'DELETE FROM users WHERE id =?';connection.query(deleteQuery, [deleteId], (err, results) => {if (err) {console.error('Error deleting data:', err);return;}console.log('Deleted rows:', results.affectedRows);});// 关闭数据库连接connection.end((err) => {if (err) {console.error('Error closing database connection:', err);return;}console.log('Database connection closed.');});
案例:用户管理系统数据库操作
假设我们要创建一个用户管理系统,使用 Node.js 和 MySQL 数据库。以下是实现的部分代码:
const mysql = require('mysql2');const connection = mysql.createConnection({host: 'localhost',user: 'your_username',password: 'your_password',database: 'user_management'
});// 添加用户
function addUser(user) {const insertQuery = 'INSERT INTO users (name, email) VALUES (?,?)';return new Promise((resolve, reject) => {connection.query(insertQuery, [user.name, user.email], (err, results) => {if (err) reject(err);else resolve(results.insertId);});});
}// 获取用户
function getUserById(id) {const selectQuery = 'SELECT * FROM users WHERE id =?';return new Promise((resolve, reject) => {connection.query(selectQuery, [id], (err, results) => {if (err) reject(err);else resolve(results[0]);});});
}// 更新用户
function updateUser(id, user) {const updateQuery = 'UPDATE users SET name =?, email =? WHERE id =?';return new Promise((resolve, reject) => {connection.query(updateQuery, [user.name, user.email, id], (err, results) => {if (err) reject(err);else resolve(results.affectedRows);});});
}// 删除用户
function deleteUser(id) {const deleteQuery = 'DELETE FROM users WHERE id =?';return new Promise((resolve, reject) => {connection.query(deleteQuery, [id], (err, results) => {if (err) reject(err);else resolve(results.affectedRows);});});
}
十、使用 Express 框架操作数据库
1.安装必要模块:
安装 Express、mysql2
和 express-myconnection
。
npm install express mysql2 express-myconnection
2. 配置数据库连接:
const express = require('express');const app = express();const mysql = require('mysql2');const myConnection = require('express-myconnection');const dbOptions = {host: 'localhost',user: 'your_username',password: 'your_password',database: 'your_database_name'};app.use(myConnection(mysql, dbOptions, 'single'));
3.定义路由操作数据库:
app.get('/users', (req, res) => {req.getConnection((err, connection) => {if (err) {return res.sendStatus(500);}connection.query('SELECT * FROM users', (err, results) => {connection.release();if (err) {return res.sendStatus(500);}res.json(results);});});});app.post('/users', (req, res) => {const newUser = req.body;req.getConnection((err, connection) => {if (err) {return res.sendStatus(500);}connection.query('INSERT INTO users SET?', newUser, (err, results) => {connection.release();if (err) {return res.sendStatus(500);}res.sendStatus(201);});});});
十一、总结
本文全面介绍了 Node.js 的入门知识,包括安装、基本概念、文件操作、数据库操作以及使用 Express 框架。Node.js 为 JavaScript 开发者提供了强大的服务器端编程能力,通过学习和实践,您可以构建高效、可扩展的网络应用和命令行工具。在学习过程中,多实践、多尝试不同功能,参考官方文档和在线资源,以加深对 Node.js 的理解。