-
基础概念
- 问 :什么是 Node.js?它的非阻塞 I/O 和事件驱动机制是如何工作的?
- 答 :Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,用于服务器端开发。它的非阻塞 I/O 和事件驱动机制通过使用回调函数或 Promise 来处理异步操作,不会阻塞主线程,从而提高了程序的并发性能。当一个任务完成时,会触发对应的事件,执行相应的回调函数来处理结果。
-
模块系统
- 问 :Node.js 中的模块系统是如何工作的?有哪些模块加载机制?
- 答 :Node.js 使用 CommonJS 模块系统,每个文件都是一个独立的模块。模块通过
require()函数来加载其他模块,module.exports或exports用于导出模块中的函数或变量。模块加载机制包括先查找核心模块,然后查找文件模块(按照特定的目录顺序和文件后缀顺序查找)。
-
网络编程
- 问 :如何使用 Node.js 创建一个 HTTP 服务器?请举例说明。
- 答 :可以使用 Node.js 自带的
http模块来创建 HTTP 服务器。例如:
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
});
server.listen(3000, '127.0.0.1', () => {
console.log('Server running at http://127.0.0.1:3000/');
});
这段代码创建了一个简单的 HTTP 服务器,监听 3000 端口,当客户端请求时,返回 “Hello World”。
-
文件操作类
- 问 :如何使用 Node.js 进行文件读取、写入和删除操作?请举例说明。
- 答 :可以使用 Node.js 的
fs模块来进行文件操作。例如,读取文件:
const fs = require('fs');
fs.readFile('file.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
写入文件:
const fs = require('fs');
fs.writeFile('file.txt', 'Hello World', (err) => {
if (err) throw err;
console.log('File written successfully');
});
删除文件:
const fs = require('fs');
fs.unlink('file.txt', (err) => {
if (err) throw err;
console.log('File deleted successfully');
});
这些操作都是异步的,也有对应的同步方法,如 `fs.readFileSync()`、`fs.writeFileSync()`、`fs.unlinkSync()`。
-
数据库操作
- 问 :如何使用 Node.js 连接和操作 MongoDB 数据库?请举例说明。
- 答 :可以使用
mongodb驱动库来连接和操作 MongoDB 数据库。例如,连接数据库并插入一条数据:
const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017';
const dbName = 'mydatabase';
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
if (err) throw err;
const db = client.db(dbName);
const collection = db.collection('mycollection');
collection.insertOne({ name: 'John', age: 30 }, (err, result) => {
if (err) throw err;
console.log('Document inserted successfully');
client.close();
});
});
查询数据:
collection.find({}).toArray((err, docs) => {
if (err) throw err;
console.log(docs);
client.close();
});
-
进程管理
- 问 :如何在 Node.js 中创建和管理子进程?有什么应用场景?
- 答 :可以使用
child_process模块来创建和管理子进程。例如,使用spawn()方法创建子进程:
const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
应用场景包括执行系统命令、调用其他程序、进行耗时的计算等。
-
异步编程
- 问 :在 Node.js 中有哪些异步编程模式?它们的优缺点是什么?
- 答 :Node.js 中的异步编程模式包括回调函数、Promise 和 async/await。回调函数是最基本的异步模式,但容易出现回调地狱,导致代码难以维护。Promise 提供了一种更清晰的异步处理方式,可以避免回调地狱,但仍然需要处理嵌套问题。async/await 是基于 Promise 的语法糖,使异步代码看起来像同步代码,提高了代码的可读性和可维护性。
以下是 Node.js 的一些核心 API:
- Buffer 模块 :用于处理二进制数据。
Buffer是一个类似数组的对象,用于存储原始数据。可以使用Buffer.alloc()、Buffer.from()等方法创建 Buffer 实例,进行数据的读写和转换。 - Events 模块 :提供了
EventEmitter类,用于处理事件驱动编程。通过on()方法监听事件,emit()方法触发事件。 - Fs 模块 :用于文件系统操作,如读取、写入、删除文件和目录等。
- Http 模块 :用于创建 HTTP 服务器和客户端,处理 HTTP 请求和响应。
- Os 模块 :提供了操作系统相关的实用工具函数,如获取操作系统信息、CPU 信息等。
- Path 模块 :用于处理和转换文件路径。
- Process 模块 :提供了当前 Node.js 进程的相关信息和控制方法,如获取环境变量、退出进程等。
- Stream 模块 :提供了流的抽象接口,用于处理数据流,如可读流、可写流、双工流和变换流。
- Url 模块 :用于 URL 的解析和格式化。
- Util 模块 :提供了各种实用工具函数,如继承方法、格式化方法等。