Chủ đề của Server-Side development with NodeJS, Express, and MongoDB

SDN302 Chương 1 - Node.js căn bản: kiến trúc và bất đồng bộ

Chương 1 môn SDN302 dựng nền tảng Node.js: bản chất runtime cho phép JavaScript chạy phía máy chủ, đặc trưng đơn luồng nhưng khả năng mở rộng cao nhờ vòng lặp sự kiện (event loop) và I/O bất đồng bộ không chặn, mô hình hướng sự kiện với EventEmitter, cơ chế module và npm, làm việc với hệ thống tệp qua fs.readFile và stream, cùng ba cách xử lý bất đồng bộ là callback, Promise với ba trạng thái pending - fulfilled - rejected, và async/await kèm try/catch. Trọn bộ câu hỏi trắc nghiệm có giải thích.

Xem danh sách câu hỏi18 câu hỏi100% có giải thích

Bắt đầu bằng Chế độ học nếu bạn muốn đáp án và giải thích hiện ngay sau mỗi câu — không bấm giờ, dừng lúc nào cũng được. Chọn Thi thử khi muốn biết mình đang ở đâu: có bấm giờ, chấm điểm ở cuối, và giải thích chỉ mở sau khi nộp.

Học ngân hàng câu hỏi của chủ đề

Luyện tập theo chủ đề này

18Câu hỏi hiện có

Câu hỏi của chủ đề

18/18 câuHết danh sách
Afs.readFile
Bfs.readSync
Cfs.readFileSync
Dfs.read
Lời giải
Để đọc file trong Node.js, bạn có thể sử dụng các phương thức sau. Đầu tiên, bạn có thể sử dụng phương thức fs.readFile(). Phương thức này đọc file và trả về dữ liệu dưới dạng chuỗi. Tuy nhiên, phương thức này không đảm bảo dữ liệu được đọc đồng bộ. Để đảm bảo dữ liệu được đọc đồng bộ, bạn có thể sử dụng phương thức fs.readFileSync(). Phương thức này đọc file và trả về dữ liệu dưới dạng chuỗi đồng thời chờ đợi cho đến khi dữ liệu được đọc hoàn tất.
Mở trang câu hỏi này →
AUsing Promises
BUsing nesting Callbacks
CUsing other control flow libraries
DUsing Async/Await
Lời giải
Để xử lý các tác vụ bất đồng bộ một cách dễ đọc và duy trì được, chúng ta có thể sử dụng một số phương pháp sau. Trước hết, chúng ta có thể sử dụng Promises. Promises là một cách để xử lý các tác vụ bất đồng bộ một cách dễ dàng và đọc được. Chúng ta có thể sử dụng các phương thức như then() và catch() để xử lý các tác vụ bất đồng bộ. Thứ hai, chúng ta có thể sử dụng Async/Await. Async/Await là một cách để xử lý các tác vụ bất đồng bộ một cách dễ dàng và đọc được. Chúng ta có thể sử dụng các từ khóa async và await để xử lý các tác vụ bất đồng bộ. Ngoài ra, chúng ta cũng có thể sử dụng các thư viện khác để xử lý các tác vụ bất đồng bộ, chẳng hạn như thư viện async/await của Node.js.
Mở trang câu hỏi này →
3Which statements about Promises in Node.js are true? (Choose 2 answers)4 lựa chọnTrung bình40% trả lời đúng
AA Promise represents the eventual completion (or failure) of an asynchronous operation and its resulting value.
BPromises are used to handle synchronous operations.
CA Promise is in one of three states: pending, fulfilled, or rejected.
DPromises can only handle one asynchronous operation at a time.
Lời giải
Các câu hỏi về Promises trong Node.js là đúng như sau: Promises đại diện cho việc hoàn thành (hoặc thất bại) của một hoạt động bất đồng bộ và giá trị kết quả. Một Promises có thể được xem là trong một trong ba trạng thái: đang chờ đợi (pending), đã hoàn thành (fulfilled), hoặc đã bị từ chối (rejected). Điều này cho phép chúng ta dễ dàng quản lý các hoạt động bất đồng bộ và xử lý kết quả một cách hiệu quả.
Mở trang câu hỏi này →
4Which of the following are valid ways to handle errors in Node.js? (Choose 2 answers)4 lựa chọnTrung bình60% trả lời đúng
AIgnoring errors as Node.js handles them automatically
BUsing try-catch block
CUsing process.on('exit') event
DAttaching an error event listener to EventEmitter instances
Lời giải
Để xử lý lỗi trong Node.js, có nhiều cách khác nhau. Một trong số đó là sử dụng khối try-catch. Khối try-catch cho phép bạn bắt các lỗi xảy ra trong mã và thực hiện các hành động cụ thể khi lỗi xảy ra. Ví dụ, bạn có thể sử dụng try-catch để bắt lỗi khi mở một tệp tin và thực hiện các hành động khi tệp tin không thể mở được. Một cách khác là gắn một listener cho sự kiện error của các đối tượng EventEmitter. Các đối tượng EventEmitter trong Node.js có thể phát ra các sự kiện khác nhau, bao gồm cả sự kiện error. Bằng cách gắn một listener cho sự kiện error, bạn có thể bắt các lỗi xảy ra và thực hiện các hành động cụ thể khi lỗi xảy ra. Cả hai cách trên đều là các cách hợp lệ để xử lý lỗi trong Node.js.
Mở trang câu hỏi này →
AIt makes the code easier to read and understand.
BIt ensures the code runs synchronously.
CIt simplifies error handling with try/catch blocks.
DIt eliminates the need for callbacks entirely.
Lời giải
Khi sử dụng async/await trong mã nguồn, có nhiều lợi ích. Trước hết, nó giúp cho mã nguồn trở nên dễ đọc và dễ hiểu hơn. Điều này là vì async/await cho phép chúng ta viết mã nguồn như một chuỗi các lệnh, thay vì phải sử dụng các callback phức tạp. Thứ hai, async/await giúp đơn giản hóa việc xử lý lỗi bằng cách sử dụng try/catch blocks. Điều này cho phép chúng ta dễ dàng bắt và xử lý các lỗi trong mã nguồn, thay vì phải sử dụng các callback phức tạp để xử lý lỗi. Ngoài ra, async/await cũng giúp giảm thiểu sự phức tạp của mã nguồn, làm cho nó trở nên dễ bảo trì và dễ hiểu hơn.
Mở trang câu hỏi này →
6Which of the following will correctly create a readable stream in Node.js?4 lựa chọnTrung bình60% trả lời đúng
Aconst fs = require('fs'); const stream = fs.createStream('input.txt');
Bconst fs = require('fs'); const stream = fs.createReadStream('input.txt');
Cconst fs = require('fs'); const stream = fs.createReadable('input.txt');
Dconst fs = require('fs'); const stream = fs.newStream('input.txt');
Lời giải

Để tạo một luồng đọc có thể đọc được trong Node.js, bạn cần sử dụng hàm createReadStream() từ module fs. Hàm này sẽ tạo một luồng đọc từ một tệp tin cụ thể. Ví dụ, bạn muốn đọc nội dung của tệp tin 'input.txt', bạn có thể sử dụng hàm createReadStream() như sau: const fs = require('fs'); const stream = fs.createReadStream('input.txt');. Điều này sẽ tạo một luồng đọc có thể đọc được nội dung của tệp tin 'input.txt'.

Mở trang câu hỏi này →
7How can optimize code to work efficiently with the event loop in Node.js?4 lựa chọnTrung bình50% trả lời đúng
AAvoiding blocking the event loop
BUsing setTimeout() instead of setImmediate()
CAvoiding nested callbacks
DWriting non-blocking code
Lời giải
Để tối ưu hóa mã code để hoạt động hiệu quả với vòng lặp sự kiện trong Node.js, chúng ta cần tránh chặn vòng lặp sự kiện. Điều này có thể đạt được bằng cách sử dụng mã không chặn. Ví dụ, thay vì sử dụng các hàm callback lồng nhau, chúng ta có thể sử dụng các hàm như async/await hoặc Promise để viết mã không chặn. Ngoài ra, chúng ta cũng cần tránh sử dụng các hàm như fs.readFileSync() hoặc require() vì chúng có thể chặn vòng lặp sự kiện. Thay vào đó, chúng ta có thể sử dụng các hàm như fs.readFile() hoặc require() với tham số callback để đọc dữ liệu một cách không chặn.
Mở trang câu hỏi này →
8Which of the following are valid ways to handle errors in Node.js?4 lựa chọnTrung bình60% trả lời đúng
AIgnoring errors as Node.js handles them automatically
BUsing try-catch block
CUsing process.on('exit') event
DAttaching an error event listener to EventEmitter instances
Lời giải
Các cách xử lý lỗi trong Node.js hợp lệ là gì? Trong Node.js, việc xử lý lỗi là rất quan trọng để đảm bảo ứng dụng của bạn không bị dừng đột ngột khi gặp lỗi. Có một số cách để xử lý lỗi trong Node.js, bao gồm sử dụng khối try-catch để bắt các lỗi khi thực hiện các hàm, sử dụng sự kiện error của EventEmitter để bắt các lỗi khi sử dụng các đối tượng EventEmitter. Sử dụng khối try-catch là một cách phổ biến để bắt các lỗi khi thực hiện các hàm. Khi gặp lỗi, khối try-catch sẽ bắt lỗi và thực hiện các hành động cần thiết để xử lý lỗi. Sử dụng sự kiện error của EventEmitter là một cách khác để bắt các lỗi khi sử dụng các đối tượng EventEmitter. Khi gặp lỗi, sự kiện error sẽ được kích hoạt và thực hiện các hành động cần thiết để xử lý lỗi. Còn cách khác như sử dụng sự kiện exit của process để bắt các lỗi khi ứng dụng dừng đột ngột, nhưng cách này không được khuyến khích vì nó không thể bắt được tất cả các lỗi. Cuối cùng, cách khác như bỏ qua lỗi vì Node.js tự động xử lý lỗi, nhưng cách này không được khuyến khích vì nó có thể dẫn đến ứng dụng bị dừng đột ngột khi gặp lỗi.
Mở trang câu hỏi này →
9What is Node.js?4 lựa chọnDễ100% trả lời đúng
AA database system
BA runtime for JavaScript on the server-side
CA frontend library
DA JavaScript framework
Lời giải
Node.js là một môi trường chạy (runtime) cho JavaScript trên máy chủ. Nó cho phép các nhà phát triển sử dụng JavaScript để tạo ra các ứng dụng web và mạng máy tính. Node.js sử dụng mô hình non-blocking I/O, cho phép các ứng dụng xử lý nhiều yêu cầu đồng thời mà không cần chờ đợi nhau. Điều này làm cho Node.js trở thành một lựa chọn phổ biến cho các ứng dụng cần xử lý nhiều yêu cầu đồng thời, như các ứng dụng mạng xã hội, các trang web động và các ứng dụng thời gian thực.
Mở trang câu hỏi này →
AsetImmediate() schedules the callback function to run immediately after the current event loop iteration, regardless of the delay specified.
BsetTimeout() schedules the callback function to run after a specified delay, which can be zero (i.e., immediately) or a positive integer representing the number of milliseconds to wait.
CIf both setTimeout() and setImmediate() are called in the same loop iteration, setTimeout() will be executed before setImmediate().
DNone of the above
Lời giải

Câu hỏi này yêu cầu bạn xác định tuyên bố sai về sự khác biệt giữa setImmediate() và setTimeout(). Câu trả lời đúng là: 'Nếu cả setTimeout() và setImmediate() được gọi trong cùng một vòng lặp, setTimeout() sẽ được thực hiện trước setImmediate()'. Điều này sai vì thực tế setImmediate() sẽ được thực hiện trước setTimeout() khi cả hai được gọi trong cùng một vòng lặp. SetImmediate() được thiết kế để chạy ngay lập tức sau vòng lặp hiện tại, trong khi setTimeout() sẽ chờ đợi cho đến khi hết thời gian chờ đợi. Điều này có thể được minh họa qua ví dụ sau:

Lời giải
var i = 0;
setImmediate(function() { console.log('Immediate', i); i++; });
setTimeout(function() { console.log('Timeout', i); i++; }, 0);

Kết quả sẽ là: Immediate 0 Timeout 2 Như vậy, setImmediate() được thực hiện trước setTimeout() khi cả hai được gọi trong cùng một vòng lặp.

Mở trang câu hỏi này →
ACallbacks can only be used with setTimeout and setInterval.
BCallbacks are functions passed as arguments to other functions.
CCallbacks are executed immediately after being defined.
DCallbacks are used to handle asynchronous operations.
Lời giải
Callbacks trong Node.js là các hàm được gọi lại sau khi một hành động được thực hiện. Họ thường được sử dụng để xử lý các hoạt động bất đồng bộ. Ví dụ, khi chúng ta muốn đọc một file, Node.js sẽ không chờ đợi cho đến khi file được đọc xong mà sẽ tiếp tục thực hiện các hành động khác. Khi file được đọc xong, Node.js sẽ gọi lại hàm callback để xử lý dữ liệu. Các hàm callback có thể được gọi lại nhiều lần và có thể được sử dụng để xử lý các hoạt động như đọc file, gửi yêu cầu HTTP, v.v. Họ cũng có thể được sử dụng để xử lý các lỗi xảy ra trong quá trình thực hiện các hành động.
Mở trang câu hỏi này →
12In Node.js, which function is used to read a file asynchronously?4 lựa chọnTrung bình60% trả lời đúng
Afs.readFileSync()
Bfs.readFile()
Cfs.open()
Dfs.load()
Lời giải

Trong Node.js, để đọc một tệp tin theo cách không đồng bộ, bạn cần sử dụng hàm fs.readFile(). Hàm này cho phép bạn đọc nội dung của một tệp tin mà không cần phải chờ đợi cho đến khi tệp tin được đọc xong. Điều này giúp tăng hiệu suất và khả năng xử lý của ứng dụng. Hàm fs.readFile() nhận vào hai tham số: tên tệp tin và một hàm callback. Hàm callback sẽ được gọi khi tệp tin được đọc xong, và nó sẽ nhận vào hai tham số: lỗi (nếu có) và nội dung của tệp tin. Ví dụ:

Lời giải
fs.readFile('tên_tệp_tin.txt', 'utf8', (err, data) => {
  if (err) console.error(err); else console.log(data);
}

);

Mở trang câu hỏi này →
Đề bài
new events.EventEmitter();
emitter.on('event', () => console.log('Event triggered'));
emitter.emit('event');
console.log('End');
AEvent triggered End
BEnd Event triggered
CTriggers the event but logs nothing due to timing
DOnly 'End' if event not emitted properly
Lời giải
Khi chạy mã Node.js này, chúng ta sẽ thấy hai dòng được in ra console. Đầu tiên là 'Event triggered' do sự kiện được kích hoạt và sau đó là 'End'. Điều này xảy ra vì chúng ta đã sử dụng phương thức emitter.on để lắng nghe sự kiện 'event' và phương thức emitter.emit để kích hoạt sự kiện này. Khi sự kiện được kích hoạt, hàm console.log('Event triggered') được thực thi và in ra 'Event triggered' vào console. Sau đó, chương trình tiếp tục thực thi dòng console.log('End') và in ra 'End'. Vì vậy, kết quả cuối cùng khi chạy mã này sẽ là 'Event triggered End'.
Mở trang câu hỏi này →
14Which an asynchronous method of fs module is used to check a file exists?4 lựa chọnTrung bình55% trả lời đúng
Afs.existsFile(filePath, function(exists) { . . . } );
Bfs.exists(filePath, function(exists) { . . . } );
Cfs.fileExists(filePath, function(exists) { . . . } );
Dfs.access(filePath, fs.constants.F_OK, (err) => {…});
Lời giải

Để kiểm tra một file có tồn tại hay không, bạn có thể sử dụng phương thức bất đồng bộ (asynchronous) của module fs. Trong đó, phương thức

Lời giải
fs.exists(filePath, function(exists) {
  ...
}

); là một trong những phương thức được sử dụng phổ biến. Phương thức này sẽ kiểm tra xem file tại đường dẫn filePath có tồn tại hay không, và nếu tồn tại thì sẽ trả về giá trị true, ngược lại sẽ trả về false. Ngoài ra, bạn cũng có thể sử dụng phương thức

Lời giải
fs.access(filePath, fs.constants.F_OK, (err) => {
  ...
}

); để kiểm tra file có tồn tại hay không, nhưng phương thức này sẽ trả về một lỗi nếu file không tồn tại.

Mở trang câu hỏi này →
15Which Node.js built-in module is used for creating servers?4 lựa chọnTrung bình67% trả lời đúng
Afs
Bhttp
Curl
Dnet
Lời giải
Để tạo một server trong Node.js, chúng ta cần sử dụng một module được tích hợp sẵn. Trong các lựa chọn trên, module nào được sử dụng để tạo server?
Mở trang câu hỏi này →
16Which runtime environment allows JavaScript to run on the server side?4 lựa chọnDễ100% trả lời đúng
AAngular
BNodeJS
CReact
DVueJS
Lời giải
Môi trường chạy thời gian cho phép JavaScript chạy trên phía máy chủ là NodeJS. NodeJS là một môi trường chạy thời gian mã nguồn mở được xây dựng trên nền tảng JavaScript, cho phép các nhà phát triển viết mã JavaScript để chạy trên máy chủ. Điều này cho phép các ứng dụng web được xây dựng bằng JavaScript có thể chạy trên cả phía máy khách và phía máy chủ, tạo điều kiện thuận lợi cho việc phát triển ứng dụng web đa nền tảng. NodeJS cung cấp một loạt các tính năng và thư viện để hỗ trợ việc phát triển ứng dụng web, bao gồm hỗ trợ các giao thức mạng, cơ sở dữ liệu và các công cụ khác.
Mở trang câu hỏi này →
17Which statements about Promises in Node.js are true?4 lựa chọnDễ88% trả lời đúng
AA Promise represents the eventual completion (or failure) of an asynchronous operation and its resulting value.
BPromises are used to handle synchronous operations.
CA Promise is in one of three states: pending, fulfilled, or rejected.
DPromises can only handle one asynchronous operation at a time.
Lời giải
Các câu hỏi về Promises trong Node.js là đúng như sau: Promises đại diện cho việc hoàn thành (hoặc thất bại) của một hoạt động bất đồng bộ và giá trị kết quả. Điều này có nghĩa là Promises được sử dụng để xử lý các hoạt động bất đồng bộ, giúp chúng ta có thể viết mã đồng bộ hơn. Một Promises có thể ở một trong ba trạng thái: đang chờ đợi (pending), đã được thực hiện (fulfilled) hoặc đã bị từ chối (rejected). Điều này cho phép chúng ta có thể theo dõi trạng thái của Promises và thực hiện các hành động phù hợp. Promises có thể xử lý nhiều hoạt động bất đồng bộ cùng một lúc, giúp chúng ta có thể thực hiện các tác vụ phức tạp một cách hiệu quả.
Mở trang câu hỏi này →
18Why is Node.js described as "single-threaded but highly scalable"?4 lựa chọnTrung bình60% trả lời đúng
AIt uses multiple threads to handle requests simultaneously
BIt leverages asynchronous, non-blocking I/O operations
CIt relies on synchronous callbacks for all operations
DIt buffers all I/O operations in memory
Lời giải
Node.js được mô tả là 'một luồng nhưng có khả năng mở rộng cao' vì nó tận dụng các hoạt động I/O không chặn, không đồng bộ. Điều này cho phép Node.js xử lý nhiều yêu cầu đồng thời mà không cần tạo nhiều luồng. Mặc dù Node.js chỉ có một luồng chính, nhưng nó có thể xử lý nhiều yêu cầu khác nhau bằng cách sử dụng các hàm callback và các thư viện như async và await. Điều này giúp Node.js có khả năng mở rộng cao mà không cần tăng số lượng luồng. Ngoài ra, Node.js sử dụng bộ nhớ đệm để lưu trữ các yêu cầu đang chờ xử lý, giúp giảm thiểu thời gian chờ đợi và tăng hiệu suất.
Mở trang câu hỏi này →

Đề có câu hỏi của chủ đề này

2 đề chứa ít nhất một câu thuộc chủ đề — mở đề để làm cả bộ, không chỉ từng câu.