1、想创建一个文件,通过流的方式读取数据,该怎么做?()

A、调用fs.open方法
B、调用fs.read方法
C、调用fs.readFile方法
D、调用fs.createReadStream创建一个Readable流,然后监听data事件处理数据

1、D

知识点:流式读取文件

解析:fs模块的createReadStream可以创建一个fs.ReadStream实例,ReadStream实现了stream.Readable接口,stream.Readable在数据到达时发射data事件,通过给data关联callback就可以处理数据。

当使用createReadStream创建一个fs.ReadStream实例后,可以通过监听data事件来处理数据。下面是一个代码案例:

const fs = require('fs');

const readStream = fs.createReadStream('file.txt');

readStream.on('data', (chunk) => {
  console.log(`Received ${chunk.length} bytes of data.`);
  // 在这里可以对数据进行处理
});

readStream.on('end', () => {
  console.log('Data reading finished.');
});

readStream.on('error', (err) => {
  console.error('Error occurred:', err);
});

在上面的例子中,我们先创建了一个fs.ReadStream实例,传入了要读取的文件路径作为参数。然后监听data事件,在事件的回调函数中处理每次接收到的数据块。最后,我们还监听了end事件,表示数据读取完成,以及error事件,以处理任何可能发生的错误。

2、想知道一个stream.Writable实例发生了什么错误该怎么办?()

A、调用error方法
B、监听error事件,提供一个callbackcallback的参数是Error实例,保存了错误信息
C、不可能发生错误
D、监听finish事件,然后再调用error方法判断是否发生了错误

2、B

知识点:处理流的错误

解析:stream.Writable有一个名为"error"的事件,在发生错误时会发射,它对应的callback的参数是Error对象,保存了错误信息,我们可以直接在callback中访问具体的错误信息。

const fs = require('fs');

const writeStream = fs.createWriteStream('output.txt');

writeStream.on('error', (err) => {
  console.error('Error occurred:', err.message);
  // 可以在这里访问具体的错误信息,如 err.code、err.stack 等
});

writeStream.write('Hello, World!', 'utf8');
writeStream.end();

在上面的例子中,我们创建了一个 fs.WriteStream 实例,用于向文件 output.txt 中写入数据。当发生错误时,error 事件将被触发,回调函数中的 err 参数将是一个 Error 对象,其中包含有关错误的详细信息。在上面的示例中,我们通过 err.message 访问了错误信息,你还可以使用其他 Error 对象的属性来获取更多的错误细节,比如 err.codeerr.stack 等。

3、在Node.js代码中要加载http模块,怎么做()

A、http模式是全局的,无需加载,直接使用即可
B、使用require('http')即可
C、使用module方法
D、使用exports方法

3、B

知识点:加载模块

解析:Node.js提供了require方法来加载模块,只需提供模块名字即可。

// 加载内置模块
const fs = require('fs');
const http = require('http');

// 加载自定义模块
const myModule = require('./myModule');

// 使用加载的模块
fs.readFile('file.txt', 'utf8', (err, data) => {
  if (err) {
    console.error('Error occurred:', err.message);
    return;
  }
  console.log('File contents:', data);
});

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello, World!');
});

server.listen(3000, () => {
  console.log('Server is running on port 3000');
});

console.log(myModule.myFunction());

上面的代码展示了几种不同类型的模块加载方式。首先,我们加载了两个内置模块 fshttp,它们是 Node.js 默认提供的模块。然后,我们加载了一个自定义模块 myModule,它的路径是相对于当前脚本的。最后,我们使用加载的模块进行一些操作,比如读取文件、创建 HTTP 服务器,并调用自定义模块中的函数。

4、在Node.js中,想让自定义的类具有发射事件的能力,需要继承哪个类?()

A、Events
B、events.Event
C、events.EventEmitter
D、Buffer

4、C

知识点:事件

解析:一个类继承events.EventEmitter就拥有了事件能力,在合适的时候调用emitter.emit即可发射自定义事件。

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

// 监听自定义事件
myEmitter.on('customEvent', (arg1, arg2) => {
  console.log('customEvent triggered with arguments:', arg1, arg2);
});

// 发射自定义事件
myEmitter.emit('customEvent', 'Hello', 'World');

在上面的代码中,我们定义了一个 MyEmitter 类,它继承了 events.EventEmitter。然后我们创建了一个 myEmitter 实例,该实例就拥有了事件的能力。我们使用 on 方法来监听自定义事件 customEvent,并在事件触发时打印出传入的参数。最后,我们使用 emit 方法来发射自定义事件 customEvent,并传入两个参数 'Hello''World'

当运行上述代码时,将会输出:

customEvent triggered with arguments: Hello World

这表明自定义事件已经发射成功,并且事件回调函数被触发并接收到了传入的参数。

5、要使用node.js的http模块创建一个http server,需要调用哪些方法()

A、http.createClient
B、http.createServer
C、http.Server.listen
D、http.get

5、B,C

知识点:http模块

解析:使用http模块的createServer方法可以创建一个http.Server对象,再调用http.Server.listen就可以让http服务器监听到某个端口上。

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello, World!');
});

server.listen(3000, () => {
  console.log('Server is running on port 3000');
});

在上面的代码中,我们使用 createServer 方法创建了一个 HTTP 服务器对象,并传入一个回调函数作为参数。这个回调函数会在每次有请求到达时被执行,可以在其中处理请求并返回响应。在本例中,我们简单地返回了一个带有 “Hello, World!” 文本的响应。

然后,我们调用 listen 方法,传入要监听的端口号(这里使用了 3000)和一个可选的回调函数。在回调函数中输出一条日志,表示服务器已经成功开始监听指定的端口。

运行上述代码后,服务器将在指定的端口上启动并等待请求。你可以通过在浏览器中访问 http://localhost:3000 来测试该服务器,将会看到 “Hello, World!” 的响应。

6、想要监听事件,可以用下列哪些方法?()

A、emitter.addListener
B、emitter.on
C、emitter.once
D、emitter.emit

6、A,B,C

知识点:处理事件

解析:Node.js中很多类都实现了EventEmitter接口,类的客户可以通过监听事件提供回调函数的方式来与类交互。addListener和on可以给指定的事件添加监听器(callback函数),每当事件发生时,这些callback都会被调用。而once方法给事件设置的监听器,只触发一次。

Node.js 中的许多类都实现了 EventEmitter 接口,使用事件监听器(回调函数)的方式与类进行交互。EventEmitter 提供了 addListenerononce 方法来给指定的事件添加监听器,每当事件发生时,这些回调函数都会被调用。once方法设置的监听器只会触发一次。

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

// 使用 addListener 或 on 方法添加事件监听器
myEmitter.addListener('customEvent', () => {
  console.log('Listener 1 called');
});

myEmitter.on('customEvent', () => {
  console.log('Listener 2 called');
});

// 使用 once 方法添加只触发一次的监听器
myEmitter.once('customEvent', () => {
  console.log('Listener 3 called (once)');
});

// 触发自定义事件
myEmitter.emit('customEvent');

// 再次触发自定义事件
myEmitter.emit('customEvent');

在上面的代码中,我们定义了一个 MyEmitter 类,它继承了 EventEmitter 接口。然后我们创建了一个 myEmitter 实例,并为 customEvent 事件添加了三个不同的监听器。addListenerononce 方法都可以使用来添加监听器。

接下来,我们调用 emit 方法触发了 customEvent 事件。当事件被触发时,每个添加的监听器都会按照添加顺序被调用。注意,在上面的示例中,once 方法设置的监听器只会触发一次,而 addListeneron 方法设置的监听器会在每次事件发生时都被调用。

运行上述代码后,将会输出以下内容:

Listener 1 called
Listener 2 called
Listener 3 called (once)
Listener 2 called

这表明添加的监听器按照添加顺序被调用,once 方法设置的监听器仅触发了一次,而其他的监听器在每次事件发生时都被调用。

7、想知道一个字符串是否包含某个字符,该怎么做?()

A、调用indexOf,返回值不是-1就说明包含指定的字符
B、调用lastIndexOf,返回值不是-1就说明包含指定的字符
C、调用match方法
D、调用search方法

7、A,B,C,D

知识点:字符串处理

解析:几种方法都可以

调用indexOf

调用 indexOf 方法会返回指定字符在字符串中第一次出现的索引位置,如果找不到则返回 -1。因此,可以根据返回值是否为 -1 来判断字符串是否包含指定的字符。下面是一个案例代码:

const str = 'Hello, World!';
const char = 'o';

const index = str.indexOf(char);

if (index !== -1) {
  console.log(`The character "${char}" is found at index ${index}`);
} else {
  console.log(`The character "${char}" is not found in the string`);
}

在上面的代码中,我们定义了一个字符串 str 和一个指定字符 char。然后,我们使用 indexOf 方法找到字符 char 在字符串 str 中第一次出现的索引,并将结果保存在变量 index 中。

接下来,我们使用条件语句判断 index 是否等于 -1。如果不等于 -1,表示字符 char 存在于字符串 str 中,我们输出包含字符的消息,包括字符本身和它的索引。如果等于 -1,表示字符 char 不在字符串中,我们输出不包含字符的消息。

运行上述代码后,将会输出以下内容:

The character "o" is found at index 4

这表明字符 “o” 在字符串 “Hello, World!” 中第一次出现的索引为 4。

调用lastIndexOf

调用 lastIndexOf 方法会返回指定字符在字符串中最后一次出现的索引位置,如果找不到则返回 -1。因此,可以根据返回值是否为 -1 来判断字符串是否包含指定的字符。下面是一个案例代码:

const str = 'Hello, World!';
const char = 'o';

const lastIndex = str.lastIndexOf(char);

if (lastIndex !== -1) {
  console.log(`The character "${char}" is found at last index ${lastIndex}`);
} else {
  console.log(`The character "${char}" is not found in the string`);
}

在上面的代码中,我们和之前一样定义了一个字符串 str 和一个指定字符 char。然后,我们使用 lastIndexOf 方法找到字符 char 在字符串 str 中最后一次出现的索引,并将结果保存在变量 lastIndex 中。

接下来,我们使用条件语句判断 lastIndex 是否等于 -1。如果不等于 -1,表示字符 char 存在于字符串 str 中,我们输出包含字符的消息,包括字符本身和它的最后一次出现的索引。如果等于 -1,表示字符 char 不在字符串中,我们输出不包含字符的消息。

运行上述代码后,将会输出以下内容:

The character "o" is found at last index 8

这表明字符 “o” 在字符串 “Hello, World!” 中最后一次出现的索引为 8。