您好,登录后才能下订单哦!
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,广泛应用于服务器端开发。由于其高效、轻量级和事件驱动的特性,Node.js 成为了许多开发者的首选技术。在面试中,Node.js 相关的知识点是常见的考察内容。本文将详细介绍 Node.js 面试中常见的问题及其解答,帮助读者更好地准备面试。
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它允许开发者使用 JavaScript 编写服务器端代码。Node.js 采用事件驱动、非阻塞 I/O 模型,使其轻量且高效,特别适合处理高并发的网络应用。
Node.js 提供了许多核心模块,常用的包括:
fs
模块读取文件?const fs = require('fs');
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data);
});
http
模块创建一个简单的 HTTP 服务器?const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('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/');
});
事件循环是 Node.js 处理异步操作的核心机制。它允许 Node.js 在单线程中处理大量并发请求。事件循环通过不断地检查事件队列,执行回调函数来处理异步操作。
事件循环分为以下几个阶段:
setTimeout
和 setInterval
的回调。setImmediate
的回调。socket.on('close', ...)
。setImmediate
和 setTimeout
有什么区别?setImmediate
的回调在事件循环的 Check 阶段执行。setTimeout
的回调在事件循环的 Timers 阶段执行。在同一个事件循环中,setImmediate
的回调总是先于 setTimeout
的回调执行。
setImmediate(() => {
console.log('setImmediate');
});
setTimeout(() => {
console.log('setTimeout');
}, 0);
输出顺序为:
setImmediate
setTimeout
回调函数是作为参数传递给另一个函数的函数,通常用于处理异步操作的结果。在 Node.js 中,回调函数常用于处理 I/O 操作、定时器等异步任务。
const fs = require('fs');
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data);
});
回调地狱是指多层嵌套的回调函数,导致代码难以阅读和维护。避免回调地狱的方法包括:
then
和 catch
处理异步操作。async
和 await
关键字,使异步代码看起来像同步代码。const fs = require('fs').promises;
fs.readFile('example.txt', 'utf8')
.then(data => {
console.log(data);
})
.catch(err => {
console.error(err);
});
const fs = require('fs').promises;
async function readFile() {
try {
const data = await fs.readFile('example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error(err);
}
}
readFile();
CommonJS 是 Node.js 使用的模块系统,它允许开发者将代码拆分为多个模块,并通过 require
和 module.exports
进行导入和导出。
// myModule.js
function myFunction() {
console.log('Hello from myModule!');
}
module.exports = myFunction;
const myFunction = require('./myModule');
myFunction(); // 输出: Hello from myModule!
ES6 模块是 ECMAScript 6 引入的模块系统,使用 import
和 export
关键字进行模块的导入和导出。与 CommonJS 模块相比,ES6 模块具有以下特点:
流是 Node.js 中处理数据的一种方式,特别适合处理大量数据或需要逐步处理的数据。流分为四种类型:
const fs = require('fs');
const readableStream = fs.createReadStream('example.txt', 'utf8');
readableStream.on('data', chunk => {
console.log(chunk);
});
readableStream.on('end', () => {
console.log('File reading completed.');
});
readableStream.on('error', err => {
console.error(err);
});
const fs = require('fs');
const writableStream = fs.createWriteStream('output.txt');
writableStream.write('Hello, World!\n');
writableStream.write('This is a test.\n');
writableStream.end(() => {
console.log('File writing completed.');
});
在 Node.js 中,错误处理通常通过回调函数的第一个参数、Promise 的 catch
方法或 try/catch
块来实现。
try/catch
处理异步错误?async function readFile() {
try {
const data = await fs.readFile('example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error(err);
}
}
readFile();
可以使用 process.on('uncaughtException')
来捕获未捕获的异常:
process.on('uncaughtException', err => {
console.error('Uncaught Exception:', err);
process.exit(1); // 退出进程
});
cluster
模块创建多个进程,充分利用多核 CPU。cluster
模块创建多进程应用?const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died`);
});
} else {
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello, World!\n');
}).listen(8000);
console.log(`Worker ${process.pid} started`);
}
console.log
:在代码中插入 console.log
语句,输出调试信息。node inspect
命令启动调试器。--inspect
参数启动 Node.js 应用,然后在 Chrome DevTools 中进行调试。--inspect
参数: node --inspect app.js
chrome://inspect
。Content-Security-Policy
、X-Content-Type-Options
等。Express.js 是一个基于 Node.js 的 Web 应用框架,提供了丰富的功能来简化 Web 应用的开发。它支持路由、中间件、模板引擎等功能。
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello, World!');
});
app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
Koa.js 是一个由 Express.js 原班人马开发的 Web 框架,旨在提供更简洁、更强大的 API。Koa.js 使用 async/await 处理异步操作,避免了回调地狱。
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = 'Hello, World!';
});
app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
const mysql = require('mysql');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'test'
});
connection.connect(err => {
if (err) {
console.error('Error connecting to database:', err);
return;
}
console.log('Connected to database');
});
connection.query('SELECT * FROM users', (err, results) => {
if (err) {
console.error('Error executing query:', err);
return;
}
console.log(results);
});
connection.end();
const { MongoClient } = require('mongodb');
const uri = 'mongodb://localhost:27017';
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });
async function run() {
try {
await client.connect();
const database = client.db('test');
const collection = database.collection('users');
const result = await collection.find({}).toArray();
console.log(result);
} finally {
await client.close();
}
}
run().catch(console.dir);
可以使用 Mocha
和 Chai
进行单元测试。
const chai = require('chai');
const expect = chai.expect;
function add(a, b) {
return a + b;
}
describe('add function', () => {
it('should return the sum of two numbers', () => {
expect(add(1, 2)).to.equal(3);
});
});
可以使用 Supertest
进行集成测试。
const request = require('supertest');
const express = require('express');
const app = express();
app.get('/user', (req, res) => {
res.status(200).json({ name: 'John' });
});
describe('GET /user', () => {
it('responds with json', done => {
request(app)
.get('/user')
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200, { name: 'John' }, done);
});
});
npm install -g pm2
pm2 start app.js
pm2 list
pm2 stop app
pm2 restart app
node --inspect
和 Chrome DevTools 检测内存泄漏。weak
模块:使用 weak
模块来创建弱引用,避免内存泄漏。cluster
模块创建多个进程,充分利用多核 CPU。Node.js 是一个强大的服务器端技术,广泛应用于各种类型的应用开发。在面试中,掌握 Node.js 的基础知识、核心模块、异步编程、事件
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。