一、引言
Node.js 是一个强大的 JavaScript 运行环境,允许开发者在服务器端使用 JavaScript 进行编程。它具有高并发、高效的特点,广泛应用于 Web 开发、命令行工具等领域。本文将带您深入了解 Node.js 的安装、基本概念、文件操作、数据库操作以及使用 Express 框架的方法。
二、Node.js 的安装
- 访问 Node.js 官方网站(Node.js — Run JavaScript Everywhere)。
- 选择 “LTS”(长期支持)版本,下载适合您操作系统的安装包。
- 按照安装向导进行安装。安装完成后,在命令行中输入以下命令检查安装是否成功:
node -v
npm -v
如果能正确显示 Node.js 和 npm(Node.js 的包管理器)的版本号,则说明安装成功。
三、Node.js 的基本概念
1.模块系统
- Node.js 使用 CommonJS 模块规范,可将代码分割成多个模块,便于组织和管理。
- 通过
require()
函数引入其他模块,使用module.exports
或exports
对象导出模块功能。 - 例如:
// math.js
function 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)); // 输出 8
console.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 的理解。