🚀 Node.js实战入门:从模块化到数据库连接的全栈之旅

144 阅读4分钟

🌟 引言:Node.js不是前端的"私生子"

你以为Node.js只是前端工程师的副业工具?大错特错!这个基于V8引擎的JavaScript运行时,早已成为全栈开发的中流砥柱。今天我们就从一个简单的项目出发,用最接地气的方式聊聊Node.js那些实用技能——从模块化到数据库连接,让你彻底摆脱"只会用npm install"的初级阶段。

📦 模块化:Node.js的"乐高积木"艺术

CommonJS:Node.js的"原配"模块系统

就像每个超级英雄都有起源故事,Node.js的模块化系统也有它的"初恋"——CommonJS。看看我们项目中的module/lib/add.js

function add(a, b) { return a + b; }
module.exports = { add };

这就是CommonJS的标准写法:用module.exports导出,再用require导入。有趣的是,这种"同步加载"机制曾被前端开发者吐槽像"拨号上网",但在服务器端却恰到好处——毕竟服务器启动时多等几毫秒不算事儿!

ES Modules:模块化的"新欢"

随着ECMAScript标准的推进,Node.js也拥抱了ES Modules。看看module/lib/divi.mjs

function chu(a, b) { return a / b; }
export default chu;
export function test() { console.log('test'); }

注意文件名后缀是.mjs,这是Node.js识别ES Modules的"暗号"之一。你也可以在package.json中设置"type": "module"来全局启用。这种"import/export"语法是不是让前端同学倍感亲切?

模块混战:如何避免"选择困难症"

项目中同时存在两种模块系统怎么办?记住这个黄金法则:

  • 新项目优先用ES Modules(未来趋势)
  • 维护老项目就乖乖用CommonJS(别自找麻烦)
  • 实在要混用?可以用import()函数动态加载CommonJS模块

🌐 HTTP服务:Node.js的"看家本领"

Node.js最引以为傲的能力之一就是构建HTTP服务。看看innerModule/http.js中的极简服务器:

const http = require('http');
const server = http.createServer((req, res) => {
    res.end('hello http server');
});
server.listen(3000, () => {
    console.log('server is listen at http://localhost:3000');
});

仅仅8行代码,一个HTTP服务器就诞生了!这就像用乐高积木搭城堡——简单却强大。不过在实际项目中,我们通常会用Express这样的框架(项目package.json中就有express: ^5.1.0)来简化开发。

🛢️ 数据库连接:Node.js的"数据管家"

没有数据库的后端就像没有灵魂的躯体。项目中的sql/index.js展示了如何用mysql2连接MySQL:

const mysql = require('mysql2');
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '123456',
    database: 'demo'
});
connection.query(`select * from user`, (err, data) => {
    res.end(JSON.stringify(data));
});

小贴士:实际开发中千万不要把密码硬编码!可以用环境变量或配置文件(记得在.gitignore中排除哦,就像项目中已经做的那样)。

🎮 命令行交互:Node.js的"控制台魔术"

game.js展示了如何通过命令行与Node.js程序交互:

const playerAction = process.argv[process.argv.length - 1];
// 石头剪刀布游戏逻辑...
if (playerAction !== 'rock' && playerAction !== 'paper' && playerAction !== 'scissor') {
  console.log('请输入 rock、paper、scissor');
} else {
  const arr = ['rock', 'paper', 'scissor']
  const index = Math.floor(Math.random() * 3);
  const computerAction = arr[index];
  console.log('你出的是:' + playerAction);
  console.log('电脑出的是:' + computerAction);

  if (playerAction === computerAction) {
    console.log('平局');
  } else if (
    (playerAction == 'rock' && computerAction == 'paper') ||
    (playerAction == 'paper' && computerAction == 'scissor') ||
    (playerAction == 'scissor' && computerAction == 'rock')
  ) {
    console.log('你输了');
  } else {
    console.log('你赢了');
  }
}

通过process.argv获取命令行参数,让你的程序瞬间变身"控制台应用"。这招在写脚本工具时特别有用,比如批量处理文件、自动化部署等。

📝 实用工具:Node.js的"瑞士军刀"

Node.js内置了很多实用模块,比如:

  • fs:文件系统操作(innerModule/fs.js展示了文件读写)
  • path:路径处理(innerModule/path.js中的path.resolvepath.dirname
  • buffer:二进制数据处理(innerModule/index.js中的Buffer操作)

这些模块就像瑞士军刀,虽然小巧但功能强大,能解决开发中的各种"小麻烦"。

🚀 进阶之路:从"能用"到"精通"

如果你已经掌握了这些基础,不妨挑战一下:

  1. 用Express重构HTTP服务器,实现RESTful API
  2. 尝试用Promise封装数据库操作,避免"回调地狱"
  3. 探索cluster模块,让你的Node.js程序利用多核CPU
  4. 学习stream模块处理大文件,提升性能

💡 结语:Node.js不是银弹,但它是把好枪

Node.js绝非万能药,但在I/O密集型应用(如API服务、实时通讯)中表现出色。通过本文的项目示例,你已经见识了它的模块化系统、HTTP服务构建、数据库连接等核心能力。

记住,最好的学习方式就是动手实践——克隆这个项目,修改代码,打破它,再修复它。毕竟,程序员的成长之路,就是在不断"搞破坏"和"擦屁股"中前进的!