一、引言

Node.js 是一个强大的 JavaScript 运行环境,允许开发者在服务器端使用 JavaScript 进行编程。它具有高并发、高效的特点,广泛应用于 Web 开发、命令行工具等领域。本文将带您深入了解 Node.js 的安装、基本概念、文件操作、数据库操作以及使用 Express 框架的方法。

二、Node.js 的安装

  1. 访问 Node.js 官方网站(Node.js — Run JavaScript Everywhere)。
  2. 选择 “LTS”(长期支持)版本,下载适合您操作系统的安装包。
  3. 按照安装向导进行安装。安装完成后,在命令行中输入以下命令检查安装是否成功:
   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 管理项目依赖

  1. npm 是 Node.js 的包管理器,可轻松安装、管理和共享第三方模块。
  2. 在项目目录中使用 npm init 命令初始化项目,生成 package.json 文件记录项目信息和依赖。
  3. 使用 npm install 命令安装模块,如 npm install express。安装后模块存于 node_modules 目录,并在 package.json 中添加依赖信息。
  4. 使用 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 中的文件操作

  1. 读取文件

    • 异步读取:使用 fs.readFile()
    • 同步读取:使用 fs.readFileSync()
  2. 写入文件

    • 异步写入:使用 fs.writeFile()
    • 同步写入:使用 fs.writeFileSync()
  3. 文件追加内容

    • 异步追加:使用 fs.appendFile()
    • 同步追加:使用 fs.appendFileSync()
  4. 检查文件是否存在

    • 同步方法:使用 fs.existsSync()
    • 异步方法:使用 fs.access()
  5. 删除文件

    • 异步删除:使用 fs.unlink()
    • 同步删除:使用 fs.unlinkSync()
  6. 获取文件信息

    • 异步方法:使用 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 的理解。

10-22 08:15