前端node.js入门

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)

目录

Node.js 入门概览 

什么是Node.js?

为什么选择Node.js?

基础安装与环境配置

安装Node.js

第一个Node.js应用

创建一个简单的HTTP服务器

核心模块与API

文件系统(fs)模块

路径(path)模块

异步编程

回调函数

Promises

Async/Await

Node.js 框架与中间件

Express

中间件

数据库集成

MongoDB 与 Mongoose

错误处理

基本的错误处理

错误处理进阶

使用try/catch与async/await

错误传播

自定义错误类型


Node.js 入门概览 

什么是Node.js?

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它允许开发者在服务器端运行 JavaScript 代码。Node.js 的出现极大地改变了 Web 开发的格局,使得前后端可以使用同一种语言进行开发,极大地提高了开发效率和团队协作的便捷性。

为什么选择Node.js?

  1. 事件驱动和非阻塞I/O:Node.js 使用了事件驱动和非阻塞I/O模型,使得它非常适合处理高并发请求,能够轻松处理成千上万的并发连接。
  2. 单线程:虽然 JavaScript 本身是单线程的,但 Node.js 利用了 V8 引擎的多线程能力进行底层操作,通过事件循环和回调函数处理异步操作,减少了线程切换的开销。
  3. 丰富的生态系统:npm(Node Package Manager)是世界上最大的开源库生态系统之一,拥有超过百万个包,覆盖了从开发工具到框架、库等各个方面。
  4. 跨平台:Node.js 支持多种操作系统,包括 Windows、Linux 和 macOS,使得开发的应用可以轻松部署到不同环境中。

基础安装与环境配置

安装Node.js

Node.js 可以从其官方网站下载安装包或通过包管理器进行安装。以 Ubuntu 系统为例,可以使用以下命令安装:

curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -  
sudo apt-get install -y nodejs

安装完成后,可以通过运行 node -v 和 npm -v 来检查 Node.js 和 npm 是否安装成功及其版本。

第一个Node.js应用

创建一个简单的HTTP服务器

创建一个名为 app.js 的文件,并写入以下代码:

const http = require('http');  
  
const server = http.createServer((req, res) => {  
  res.writeHead(200, {'Content-Type': 'text/html'});  
  res.end('<h1>Hello, World!</h1>');  
});  
  
server.listen(3000, () => {  
  console.log('Server is running on http://localhost:3000');  
});

这段代码创建了一个 HTTP 服务器,监听 3000 端口,并对每一个请求返回一个简单的 HTML 页面。在终端中运行 node app.js,然后在浏览器中访问 http://localhost:3000,你应该能看到 "Hello, World!" 的页面。

核心模块与API

Node.js 提供了一系列核心模块,这些模块提供了基本的系统操作功能,如文件操作、网络编程、加密等。

文件系统(fs)模块

fs 模块用于在 Node.js 中执行文件系统的操作,如读写文件、创建目录等。

const fs = require('fs');  
  
fs.readFile('example.txt', 'utf8', (err, data) => {  
  if (err) {  
    console.error(err);  
    return;  
  }  
  console.log(data);  
});  
  
// 异步写文件  
fs.writeFile('output.txt', 'Hello, Node.js!', (err) => {  
  if (err) throw err;  
  console.log('The file has been saved!');  
});

路径(path)模块

path 模块提供了一些用于处理文件路径的实用工具。

const path = require('path');  
  
let myPath = path.join(__dirname, 'subdir', 'myfile.txt');  
console.log(myPath);  
  
// 判断文件扩展名  
let ext = path.extname(myPath);  
console.log(ext);

异步编程

Node.js 本质上是异步的,掌握异步编程模式对于编写高效、可维护的 Node.js 应用至关重要。

回调函数

回调函数是 Node.js 中处理异步操作的传统方式。

// 示例:setTimeout 的回调函数  
setTimeout(() => {  
  console.log('This message will be displayed after 2 seconds');  
}, 2000);

Promises

Promises 提供了一种更强大、更灵活的方式来处理异步操作。

new Promise((resolve, reject) => {
// 模拟异步操作
setTimeout(() => {
const success = true; // 假设操作成功
if (success) {
resolve('Operation succeeded!');
} else {
reject('Operation failed!');
}
}, 1000);
})
.then(result => {
console.log(result); // 'Operation succeeded!'
return new Promise((resolve, reject) => {
// 链式操作
setTimeout(() => {
resolve('Second operation succeeded!');
}, 500);
});
})
.then(result => {
console.log(result); // 'Second operation succeeded!'
})
.catch(error => {
console.error(error); // 捕获任何之前的 Promise 中的错误
});

Async/Await

`async/await` 是建立在 Promise 之上的语法糖,它使得异步代码看起来和同步代码一样。 

async function fetchData() {  
  try {  
    const result = await new Promise((resolve, reject) => {  
      setTimeout(() => {  
        resolve('Data fetched successfully!');  
      }, 1000);  
    });  
    console.log(result); // 'Data fetched successfully!'  
      
    // 另一个异步操作  
    const secondResult = await new Promise((resolve, reject) => {  
      setTimeout(() => {  
        resolve('Second data fetched successfully!');  
      }, 500);  
    });  
    console.log(secondResult); // 'Second data fetched successfully!'  
  } catch (error) {  
    console.error(error);  
  }  
}  
  
fetchData();

Node.js 框架与中间件

随着 Node.js 的流行,出现了许多框架和中间件,它们简化了 Web 应用的开发过程。

Express

Express 是最流行的 Node.js Web 应用框架之一,它提供了一套丰富的特性来帮助你创建各种 Web 应用和 API。

const express = require('express');  
const app = express();  
const port = 3000;  
  
app.get('/', (req, res) => {  
  res.send('Hello World!');  
});  
  
app.listen(port, () => {  
  console.log(`Example app listening at http://localhost:${port}`);  
});

中间件

中间件是 Express 强大的功能之一,它允许你在请求-响应循环的特定阶段执行代码。

const express = require('express');  
const app = express();  
  
// 日志中间件  
app.use((req, res, next) => {  
  console.log(`${new Date()}: ${req.method} ${req.url}`);  
  next(); // 不要忘记调用 next()  
});  
  
app.get('/', (req, res) => {  
  res.send('Hello World!');  
});  
  
app.listen(3000, () => {  
  console.log('Server is running on port 3000');  
});

数据库集成

Node.js 应用经常需要与数据库交互,幸运的是,有许多数据库和 Node.js 的集成方案可供选择。

MongoDB 与 Mongoose

MongoDB 是一个流行的 NoSQL 数据库,Mongoose 是一个 MongoDB 的对象数据模型(ODM)库,它为 MongoDB 数据提供了丰富的模型功能。

const mongoose = require('mongoose');  
mongoose.connect('mongodb://localhost:27017/mydatabase', {  
  useNewUrlParser: true,  
  useUnifiedTopology: true  
});  
  
const Schema = mongoose.Schema;  
  
const userSchema = new Schema({  
  name: String,  
  age: Number  
});  
  
const User = mongoose.model('User', userSchema);  
  
// 创建一个新用户  
const newUser = new User({  
  name: 'John Doe',  
  age: 30  
});  
  
newUser.save().then(() => {  
  console.log('User saved successfully!');  
}).catch(err => {  
  console.error(err);  
});

错误处理

在 Node.js 应用中,错误处理是非常重要的。合理的错误处理可以确保应用的稳定性和可靠性。

基本的错误处理

function readFile(filePath) {  
  fs.readFile(filePath, 'utf8', (err, data) => {  
    if (err) {  
      console.error('Error reading file:', err);  
      return;  
    }  
    console.log(data);  
  });  
}

错误处理进阶

在Node.js中,错误处理不仅限于简单的回调函数中的错误参数检查。随着应用复杂性的增加,我们需要更加系统和全面的错误处理策略。

使用try/catch与async/await

当使用async/await语法时,可以通过标准的try/catch结构来捕获异步操作中的错误。

async function readFileAsync(filePath) {  
  try {  
    const data = await fs.promises.readFile(filePath, 'utf8');  
    console.log(data);  
  } catch (error) {  
    console.error('Error reading file:', error);  
  }  
}  
  
readFileAsync('nonexistentfile.txt');

这里使用了fs.promises接口,它是Node.js内置的fs模块的一个承诺化版本,允许我们使用await关键字。

错误传播

在Node.js中,错误传播是一个重要的概念。当一个函数遇到错误时,它应该将这个错误传递给它的调用者。这通常是通过回调函数的错误参数或在Promise链中通过reject来完成的。

function fetchUser(userId, callback) {  
  // 模拟异步数据库查询  
  setTimeout(() => {  
    if (Math.random() > 0.5) {  
      callback(new Error('User not found'));  
    } else {  
      callback(null, { id: userId, name: 'John Doe' });  
    }  
  }, 1000);  
}  
  
fetchUser(1, (err, user) => {  
  if (err) {  
    // 错误处理  
    console.error('Failed to fetch user:', err);  
    return;  
  }  
  console.log(user);  
});  
  
// 使用Promise的版本  
function fetchUserPromise(userId) {  
  return new Promise((resolve, reject) => {  
    setTimeout(() => {  
      if (Math.random() > 0.5) {  
        reject(new Error('User not found'));  
      } else {  
        resolve({ id: userId, name: 'John Doe' });  
      }  
    }, 1000);  
  });  
}  
  
fetchUserPromise(1)  
  .then(user => console.log(user))  
  .catch(err => console.error('Failed to fetch user:', err));

自定义错误类型

在复杂的应用中,创建自定义错误类型可以使得错误处理更加清晰和灵活

class UserNotFoundError extends Error {  
  constructor(userId) {  
    super(`User with ID ${userId} not found`);  
    this.name = 'UserNotFoundError';  
  }  
}  
  
function fetchUserWithCustomError(userId) {  
  return new Promise((resolve, reject) => {  
    setTimeout(() => {  
      if (Math.random() > 0.5) {  
        reject(new UserNotFoundError(userId));  
      } else {  
        resolve({ id: userId, name: 'John Doe' });  
      }  
    }, 1000);  
  });  
}  
  
fetchUserWithCustomError(1)  
  .then(user => console.log(user))  
  .catch(err => {  
    if (err instanceof UserNotFoundError) {  
      console.error('User not found error:', err.message);  
    } else {  
      console.error('Unknown error:', err);  
    }  
  });
  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小周不摆烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值