标题
一、基础概念类
1. 什么是 Node.js?它有什么特点?
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,使 JavaScript 可以在服务器端运行。它的特点包括单线程、事件驱动、非阻塞 I/O、高效且轻量,适合构建高并发、实时性要求高的网络应用,如聊天应用、实时数据更新系统等。
2. Node.js 的应用场景有哪些?
常见应用场景有 Web 服务器开发(如 Express、Koa 框架构建的 Web 应用)、实时通信应用(如聊天室、在线游戏)、命令行工具开发、微服务架构等。
2.1讲讲koa
node.js后端的每一个路由就是一个接口。
koa2框架结合koa-router中间件,使路由更加简介明了。
1、安装koa-router
npm install koa-router --save
2、koa-router要实例化使用
3、在入口文件中使用
二、异步编程类
1. 请解释 Node.js 中的异步 I/O 和非阻塞 I/O。
非阻塞 I/O 是指当进行 I/O 操作时,程序不会等待 I/O 操作完成,而是继续执行后续代码。当 I/O 操作完成后,会通过回调等方式通知程序。
异步 I/O 是一种编程模式,它允许程序在进行 I/O 操作时不阻塞主线程的执行。Node.js 通过事件循环和回调函数来实现异步 I/O,提高了程序的性能和并发处理能力。
2. 如何处理 Node.js 中的异步操作?
可以通过以下几种方式处理异步操作:
回调函数:最基本的方式,将后续操作封装在回调函数中,当异步操作完成时调用该回调函数。
Promise:一种更优雅的处理异步操作的方式,避免了回调地狱问题。Promise 有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败),可以通过 then 和 catch 方法处理结果。
async/await:基于 Promise 的语法糖,使异步代码看起来更像同步代码,提高了代码的可读性和可维护性。
3.Nodejs进程间通信
在 Node.js 中,进程间通信(Inter-Process Communication,简称 IPC)是指不同进程之间进行数据交换和消息传递的机制。Node.js 提供了多种方式来实现进程间通信:
3.1 使用 child_process 模块进行父子进程通信
child_process 模块是 Node.js 内置的用于创建子进程的模块,它提供了多种创建子进程的方法,如 spawn、exec、fork 等,其中 fork 方法专门用于创建 Node.js 子进程并实现父子进程之间的通信。
父进程代码(parent.js):
const {
fork } = require('child_process');
// 创建子进程
const child = fork('child.js');
// 向子进程发送消息
child.send('Hello from parent!');
// 监听子进程发送的消息
child.on('message', (message) => {
console.log(`Received from child: ${
message}`);
});
// 监听子进程退出事件
child.on('exit', (code) => {
console.log(`Child process exited with code ${
code}`);
});
子进程代码(child.js):
// 监听父进程发送的消息
process.on('message', (message) => {
console.log(`Received from parent: ${
message}`);
// 向父进程发送消息
process.send('Hello from child!');
});
代码解释 在父进程中,使用 fork 方法创建子进程,并通过 child.send() 方法向子进程发送消息。 父进程通过监听
message 事件来接收子进程发送的消息。 子进程通过监听 process.on(‘message’) 事件来接收父进程的消息,并使用
process.send() 方法向父进程发送消息。
3.2.使用 Unix Domain Socket 或 Windows Named Pipe
在不同操作系统中,可以使用 Unix Domain Socket(Unix 系统)或 Windows Named Pipe(Windows 系统)来实现进程间通信。net 模块可以用来创建基于这些机制的服务器和客户端。
3.3 使用消息队列
消息队列是一种常见的进程间通信方式,可以使用第三方库如 amqplib(用于 RabbitMQ)或 kafka-node(用于 Apache Kafka)来实现。
- 通过stdin/stdout传递json:最直接的方式,适用于能够拿到“子”进程handle的场景,适用于关联进程之间通信,无法跨机器
- Node原生IPC支持:最native(地道?)的方式,比上一种“正规”一些,具有同样的局限性
- 通过socke