📅  最后修改于: 2023-12-03 15:22:45.228000             🧑  作者: Mango
以下是前32个Node.js面试问题。这些问题基于Node.js的核心概念并涵盖从基础到高级的各种主题。如果你已经学过了Node.js,那么这些问题可以帮助你更好的了解并掌握它们。
Node.js是一个JavaScript运行时环境,用于构建可伸缩的网络应用程序。
Node.js可以用于构建各种类型的网络应用程序,包括Web应用程序、API和后端服务。
Node.js是基于JavaScript构建的,因此它能够利用JavaScript的优势,如异步编程、事件驱动和函数式编程。
Node.js实现了各种核心模块,包括File System、HTTP、Net、Events、Stream等。
使用fs.exists()
方法可以检查文件是否存在。
const fs = require('fs');
fs.exists('/path/to/file', (exists) => {
if (exists) {
console.log('File exists');
} else {
console.log('File does not exist');
}
});
使用fs.readFile()
方法可以读取一个文件的内容。
const fs = require('fs');
fs.readFile('/path/to/file', (err, data) => {
if (err) throw err;
console.log(data.toString());
});
使用fs.writeFile()
方法可以向一个文件写入数据。
const fs = require('fs');
fs.writeFile('/path/to/file', 'Hello, world!', (err) => {
if (err) throw err;
console.log('Data written to file');
});
使用http.createServer()
方法可以创建一个HTTP服务器。
const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, world!');
});
server.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
可以使用http.request()
方法发起HTTP请求。
const http = require('http');
const options = {
hostname: 'www.example.com',
port: 80,
path: '/path/to/resource',
method: 'GET'
};
const req = http.request(options, (res) => {
console.log(`statusCode: ${res.statusCode}`);
res.on('data', (d) => {
process.stdout.write(d);
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
可以使用http.createServer()
方法创建一个HTTP服务器,并使用req
和res
参数处理请求和响应。
const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, world!');
});
server.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
在处理POST请求之前,需要使用req.on('data', callback)
方法监听请求数据事件,并使用req.on('end', callback)
方法监听请求结束事件。
const http = require('http');
const server = http.createServer((req, res) => {
let data = '';
req.on('data', (chunk) => {
data += chunk;
});
req.on('end', () => {
console.log('Received data:', data);
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, world!');
});
});
server.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
可以使用Express框架创建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/');
});
可以使用Connect框架创建中间件。
const connect = require('connect');
const app = connect();
const helloMiddleware = (req, res, next) => {
res.setHeader('Content-Type', 'text/plain');
res.write('Hello, ');
next();
};
const worldMiddleware = (req, res, next) => {
res.end('world!');
};
app.use(helloMiddleware);
app.use(worldMiddleware);
app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
可以使用ws模块创建WebSocket服务器。
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws) => {
console.log('WebSocket client connected');
ws.on('message', (message) => {
console.log(`Received message: ${message}`);
ws.send('Hello, world!');
});
});
可以使用Socket.IO构建实时网络应用程序。
const http = require('http');
const server = http.createServer();
const io = require('socket.io')(server);
io.on('connection', (socket) => {
console.log('WebSocket client connected');
socket.on('chat message', (message) => {
console.log(`Received message: ${message}`);
io.emit('chat message', message);
});
});
server.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
可以使用mongoose模块连接MongoDB数据库。
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true });
const schema = new mongoose.Schema({
name: String,
email: String,
password: String
});
const User = mongoose.model('User', schema);
const user = new User({
name: 'Alice',
email: 'alice@example.com',
password: 'secret'
});
user.save((err, user) => {
if (err) throw err;
console.log(user);
});
可以使用回调函数、Promise和async/await实现异步编程。
// Using callbacks
fs.readFile('/path/to/file', (err, data) => {
if (err) throw err;
console.log(data.toString());
});
// Using Promises
const readFile = util.promisify(fs.readFile);
readFile('/path/to/file')
.then((data) => console.log(data.toString()))
.catch((err) => console.error(err));
// Using async/await
const readFileAsync = async () => {
try {
const data = await readFile('/path/to/file');
console.log(data.toString());
} catch (err) {
console.error(err);
}
};
可以使用EventEmitter类实现事件驱动编程。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!');
});
myEmitter.emit('event');
可以使用Stream类实现流式编程。
const fs = require('fs');
const readStream = fs.createReadStream('/path/to/file');
readStream.on('data', (chunk) => {
console.log(`Received chunk: ${chunk}`);
});
readStream.on('end', () => {
console.log('End of stream');
});
可以使用Node.js内置的调试器或第三方调试工具进行调试。
# Using Node.js debugger
$ node inspect app.js
# Using Visual Studio Code
# Open app.js in Visual Studio Code and press F5
可以使用Mocha测试框架和Chai断言库进行单元测试。
const assert = require('chai').assert;
describe('Array', () => {
describe('#indexOf()', () => {
it('should return -1 when the value is not present', () => {
assert.equal([1, 2, 3].indexOf(4), -1);
});
});
});
可以使用Supertest模块进行集成测试。
const supertest = require('supertest');
const app = require('./app');
const request = supertest(app);
describe('GET /', () => {
it('should respond with "Hello, world!"', (done) => {
request.get('/')
.expect(200)
.expect('Content-Type', /text\/plain/)
.expect('Hello, world!', done);
});
});
可以使用ApacheBench进行性能测试。
$ ab -n 1000 -c 10 http://localhost:3000/
可以使用V8引擎提供的内存工具或第三方内存工具进行内存管理。
# Using V8 heap snapshots
$ node --inspect app.js
# Open Chrome DevTools and go to chrome://inspect/#devices
# Click "Open dedicated DevTools..."
# Go to the "Memory" tab
# Using third-party tools like Node Clinic
$ clinic doctor -- node app.js
# Open generated HTML report in browser
可以使用pm2进程管理器进行进程管理。
# Install pm2
$ npm install -g pm2
# Start application
$ pm2 start app.js
# View logs
$ pm2 logs
# Stop application
$ pm2 stop app.js
可以使用Helmet中间件进行安全性管理。
const express = require('express');
const helmet = require('helmet');
const app = express();
app.use(helmet());
app.listen(3000);
可以使用try-catch语句、错误处理中间件、错误事件等方式进行错误处理。
// Using try-catch statement
try {
const data = await readFile('/path/to/file');
console.log(data.toString());
} catch (err) {
console.error(err);
}
// Using error handling middleware
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something broke!');
});
// Using error event
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, world!');
});
server.on('error', (err) => {
console.error(err);
});
server.listen(3000);
可以使用第三方日志库或内置的console对象进行日志记录。
// Using a third-party logging library like Winston
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.simple(),
transports: [new winston.transports.Console()]
});
logger.log({
level: 'info',
message: 'Hello, world!'
});
// Using the built-in console object
console.log('Hello, world!');
可以使用第三方缓存库如Redis进行缓存管理。
const redis = require('redis');
const client = redis.createClient();
client.on('error', (err) => {
console.error(err);
});
client.set('key', 'value');
client.get('key', (err, value) => {
console.log(value);
});
可以使用i18n模块进行国际化。
const i18n = require('i18n');
i18n.configure({
locales: ['en', 'fr'],
directory: __dirname + '/locales'
});
console.log(i18n.__('Hello, world!'));
可以使用Worker Threads模块进行多线程编程。
const { Worker } = require('worker_threads');
const worker = new Worker(`
const { parentPort } = require('worker_threads');
parentPort.postMessage('Hello, world!');
`, { eval: true });
worker.on('message', (message) => {
console.log(message);
});
可以使用Multer中间件处理大文件上传。
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });
app.post('/upload', upload.single('file'), (req, res) => {
console.log(req.file);
res.send('File uploaded');
});