网站自己做,消防器材厂家东莞网站建设,关键词优化需要注意,甘肃新站优化(创作不易#xff0c;感谢有你#xff0c;你的支持#xff0c;就是我前行的最大动力#xff0c;如果看完对你有帮助#xff0c;请留下您的足迹#xff09; 目录
Node.js 入门概览
什么是Node.js#xff1f;
为什么选择Node.js#xff1f;
基础安装与环境配置
安装…(创作不易感谢有你你的支持就是我前行的最大动力如果看完对你有帮助请留下您的足迹 目录
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 事件驱动和非阻塞I/ONode.js 使用了事件驱动和非阻塞I/O模型使得它非常适合处理高并发请求能够轻松处理成千上万的并发连接。单线程虽然 JavaScript 本身是单线程的但 Node.js 利用了 V8 引擎的多线程能力进行底层操作通过事件循环和回调函数处理异步操作减少了线程切换的开销。丰富的生态系统npmNode Package Manager是世界上最大的开源库生态系统之一拥有超过百万个包覆盖了从开发工具到框架、库等各个方面。跨平台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(h1Hello, 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); } });