SDN302DễKỳ 7Chuyên ngành Cập nhật 28/07/2026

Server-Side development with NodeJS, Express, and MongoDB

Ôn luyện SDN302 – Phát triển Server-Side với Node.js, Express và MongoDB: ngân hàng câu hỏi trắc nghiệm có giải thích chi tiết, luyện thi cuối kỳ hiệu quả. Nội dung bao quát Node.js, npm, Event Loop bất đồng bộ, HTTP/HTTPS, Express.js, middleware, Express Generator, RESTful API, MongoDB & Mongoose, Mongoose Population, xác thực Passport/JWT, session & cookie, mã hoá bcrypt, upload/download file với Multer, CORS, OAuth và template EJS/Handlebars. Môn 3 tín chỉ tại FPT University, tiên quyết DBI202 và FER202.

194Câu hỏi
2Bộ đề
11Chủ đề

Câu hỏi của môn

144/194 câuCòn 50
125In 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 →
127Which 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 →
128Which 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 →
129Which 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 →
130Which 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 →
131Why 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 →
AAn API is more appropriate for interacting with the device's camera and GPS.
BAn SDK is more appropriate for interacting with the device's camera and GPS.
CAn API is more appropriate for fetching weather data from an external service.
DAn SDK is more appropriate for fetching weather data from an external service.
Lời giải
Trong trường hợp này, chúng ta cần phân tích xem nên sử dụng API hay SDK để tương tác với camera và GPS của thiết bị cũng như lấy dữ liệu thời tiết từ một dịch vụ bên ngoài. Một SDK (Toolkit phần mềm) là một tập hợp các thư viện và công cụ được thiết kế để giúp các nhà phát triển xây dựng các ứng dụng trên một nền tảng cụ thể. Trong trường hợp này, SDK sẽ cung cấp các chức năng để tương tác với camera và GPS của thiết bị, giúp giảm thiểu thời gian và công sức của nhà phát triển. Ngược lại, API (Application Programming Interface) là một giao diện được thiết kế để cho phép các ứng dụng tương tác với các dịch vụ hoặc hệ thống khác. Đối với việc lấy dữ liệu thời tiết từ một dịch vụ bên ngoài, API sẽ là lựa chọn phù hợp hơn vì nó cho phép ứng dụng của chúng ta tương tác với dịch vụ đó một cách linh hoạt và dễ dàng. Vì vậy, kết luận là chúng ta nên sử dụng SDK để tương tác với camera và GPS của thiết bị, và API để lấy dữ liệu thời tiết từ một dịch vụ bên ngoài.
Mở trang câu hỏi này →
133Consider the following code snippet for serializing an object in JavaScript4 lựa chọncó codeTrung bình67% trả lời đúng
Đề bài
using JSON. Identify which parts are responsible for serialization and deserialization. const obj = {
  name: "Alice", age: 25
}

; const serializedObj = JSON.stringify(obj); const deserializedObj =

Đề bài
JSON.parse(serializedObj);
console.log(serializedObj);

// {"name":"Alice","age":25} console.log(deserializedObj); // { name: 'Alice', age: 25 }

AJSON.stringify(obj) is responsible for serialization.
BJSON.parse(serializedObj) is responsible for deserialization.
Cconsole.log(serializedObj) is responsible for serialization.
Dconsole.log(deserializedObj) is responsible for deserialization.
Lời giải
Khi chúng ta muốn lưu trữ một đối tượng JavaScript thành một chuỗi JSON, chúng ta sử dụng hàm JSON.stringify(). Hàm này sẽ chuyển đổi đối tượng thành một chuỗi JSON. Ví dụ, trong đoạn mã trên, JSON.stringify(obj) sẽ chuyển đổi đối tượng obj thành một chuỗi JSON. Điều này được thực hiện bởi hàm JSON.stringify(), vì vậy nó chịu trách nhiệm cho quá trình serial hóa. Sau đó, chúng ta sử dụng hàm JSON.parse() để chuyển đổi chuỗi JSON trở lại thành một đối tượng JavaScript. Điều này được thực hiện bởi hàm JSON.parse(), vì vậy nó chịu trách nhiệm cho quá trình giải mã. Các câu lệnh console.log() chỉ đơn giản là in ra kết quả, chúng không chịu trách nhiệm cho quá trình serial hóa hay giải mã.
Mở trang câu hỏi này →
Aconst http = require('http'); const fs = require('fs'); http.createServer((req, res) => { if (req.method === 'GET') { fs.readFile('file.txt', (err, data) => { if (err) throw err; res.end(data); }); } }).listen(8080);
Bconst http = require('http'); const fs = require('fs'); http.createServer((req, res) => { if (req.method === 'POST') { fs.readFile('file.txt', (err, data) => { res.end(data); }); } }).listen(8080);
Cconst http = require('http'); http.createServer((req, res) => { if (req.method === 'GET') { res.end('File content'); } }).listen(8080);
Dconst http = require('http'); const fs = require('fs'); http.createServer((req, res) => { if (req.method === 'GET') { fs.writeFileSync('file.txt', 'Hello'); res.end('File written'); } }).listen(8080);
Lời giải
Để tạo một Node.js server xử lý GET request và trả về nội dung của một file, chúng ta cần sử dụng các module http và fs. Module http được sử dụng để tạo một server, trong khi module fs được sử dụng để đọc nội dung của file. Trong câu trả lời đúng, chúng ta sử dụng http.createServer để tạo một server và kiểm tra phương thức của yêu cầu (req.method === 'GET') để quyết định đọc nội dung của file hay không. Nếu phương thức là GET, chúng ta sử dụng fs.readFile để đọc nội dung của file và trả về nó qua phương thức res.end().
Mở trang câu hỏi này →
135In API design, what is the primary purpose of using query parameters in a URL?4 lựa chọnTrung bình67% trả lời đúng
ATo modify server-side data
BTo filter or sort resources without changing them
CTo authenticate users
DTo handle file uploads
Lời giải
Trong thiết kế API, mục đích chính của việc sử dụng tham số truy vấn trong URL là để lọc hoặc sắp xếp các tài nguyên mà không thay đổi chúng. Điều này cho phép người dùng có thể yêu cầu dữ liệu được sắp xếp theo một cách cụ thể hoặc được lọc theo một tiêu chí nhất định mà không cần phải thay đổi dữ liệu gốc. Ví dụ, khi yêu cầu danh sách các sản phẩm, người dùng có thể thêm tham số truy vấn để yêu cầu danh sách sản phẩm được sắp xếp theo giá tăng dần hoặc giảm dần. Điều này giúp người dùng có thể dễ dàng tìm kiếm và sử dụng dữ liệu mà không cần phải thực hiện các thao tác phức tạp trên server.
Mở trang câu hỏi này →
Đề bài
http.createServer((req, res) => {
  const parsedUrl = url.parse(req.url, true); if (parsedUrl.pathname === '/') {
    const name = parsedUrl.query.name; res.writeHead(200, {
      'Content-Type': 'text/plain'
    }
    ); res.end(`Hello, ${
      name || 'Guest'
    }
    !`);
  }
  else {
    res.writeHead(404); res.end('Not found');
  }
}

);

Đề bài
server.listen(8080);
ADisplays "Hello, Guest!"
BDisplays "Hello, Alice!"
CThrows a TypeError due to invalid query parsing
DReturns 404 with "Not found"
Lời giải
Khi một yêu cầu GET được thực hiện đến địa chỉ `http://localhost:8080/?name=Alice` trong mã Node.js sau đây, chương trình sẽ phân tích URL yêu cầu và thực hiện các hành động tương ứng. Mã Node.js sử dụng thư viện `http` để tạo một server và thư viện `url` để phân tích URL yêu cầu. Khi một yêu cầu GET được gửi đến server, chương trình sẽ phân tích URL yêu cầu và kiểm tra nếu đường dẫn yêu cầu (`pathname`) là `/`. Nếu đúng, chương trình sẽ lấy giá trị của tham số `name` từ URL yêu cầu và sử dụng nó để tạo một thông điệp chào đón. Nếu giá trị của `name` là `undefined` (do không có tham số `name` trong URL yêu cầu), chương trình sẽ sử dụng giá trị mặc định là `Guest`. Cuối cùng, chương trình sẽ trả về thông điệp chào đón với mã trạng thái 200 (OK). Trong trường hợp này, giá trị của tham số `name` là `Alice`, vì vậy thông điệp chào đón sẽ là `Hello, Alice!`.
Mở trang câu hỏi này →
137What is a significant difference between a load balancer and an API Gateway?4 lựa chọnDễ100% trả lời đúng
AA load balancer distributes network traffic across multiple servers.
BAn API Gateway primarily routes requests to backend services.
CA load balancer handles request aggregation.
DAn API Gateway manages server health checks.
Lời giải
Một trong những điểm khác biệt quan trọng giữa một bộ cân bằng tải và một cổng API là chức năng của chúng. Bộ cân bằng tải (load balancer) chủ yếu tập trung vào việc phân phối lưu lượng mạng trên nhiều máy chủ. Điều này giúp phân phối tải cân bằng, tăng hiệu suất và giảm thiểu khả năng quá tải. Ngược lại, cổng API (API Gateway) chủ yếu tập trung vào việc quản lý và định tuyến các yêu cầu đến các dịch vụ backend. Điều này bao gồm việc xác thực, mã hóa và kiểm soát truy cập. Ngoài ra, cổng API còn có thể thực hiện các chức năng khác như quản lý phiên, quản lý quyền và quản lý dữ liệu.
Mở trang câu hỏi này →
138Which command is used to initialize a package.json file in a Node.js project?4 lựa chọnTrung bình60% trả lời đúng
Anpm start
Bnpm install
Cnpm init
Dnpm run
Lời giải
Để tạo một file package.json trong dự án Node.js, bạn cần sử dụng lệnh npm init. Lệnh này sẽ giúp tạo ra một file package.json mới với các thông tin cơ bản về dự án như tên dự án, phiên bản Node.js, và các tùy chọn khác. Khi bạn chạy lệnh npm init, bạn sẽ được hỏi một loạt các câu hỏi để nhập thông tin về dự án của mình. Sau khi nhập xong, lệnh sẽ tạo ra một file package.json mới với các thông tin đã nhập. File này sẽ được sử dụng để quản lý các tùy chọn và phụ thuộc của dự án.
Mở trang câu hỏi này →
139Which HTTP method is used to partially update a resource?4 lựa chọnTrung bình63% trả lời đúng
AGET
BPUT
CPATCH
DDELETE
Lời giải
Mẹo chọn phương thức HTTP phù hợp: Khi bạn muốn cập nhật một tài nguyên một phần, bạn cần sử dụng phương thức HTTP phù hợp. Phương thức GET chỉ được sử dụng để đọc dữ liệu, không được sử dụng để cập nhật dữ liệu. Phương thức PUT thường được sử dụng để cập nhật toàn bộ tài nguyên, thay thế toàn bộ dữ liệu hiện tại. Phương thức DELETE được sử dụng để xóa một tài nguyên. Phương thức PATCH được sử dụng để cập nhật một phần của tài nguyên, cho phép bạn chỉ cập nhật những phần cần thiết mà không ảnh hưởng đến dữ liệu hiện tại.
Mở trang câu hỏi này →
A200
B301
C404
D500
Lời giải
Trạng thái HTTP 301 cho biết một tài nguyên đã được chuyển dời vĩnh viễn đến một địa chỉ mới. Điều này có nghĩa là tài nguyên đã được di chuyển và không còn tồn tại tại địa chỉ ban đầu. Khi một trang web hoặc ứng dụng web được chuyển dời, nó sẽ trả về trạng thái 301 để thông báo cho trình duyệt và các trình thu thập dữ liệu web biết rằng tài nguyên đã được di chuyển. Điều này giúp đảm bảo rằng người dùng và các trình thu thập dữ liệu web có thể truy cập tài nguyên mới một cách dễ dàng.
Mở trang câu hỏi này →
141Consider the Express.js route below. What will be the response4 lựa chọncó codeDễ100% trả lời đúng
Đề bài
if the user visits /welcome? app.get('/welcome', (req, res) => {
  res.send("Hello, Express!");
}

);

AA JSON response
BThe text "Hello, Express!"
CAn error message
DA 404 page
Lời giải
Khi người dùng truy cập đường dẫn /welcome, ứng dụng Express.js sẽ thực hiện chức năng xử lý yêu cầu (app.get) và gửi phản hồi (res.send) với nội dung 'Hello, Express!'. Điều này có nghĩa là người dùng sẽ thấy nội dung 'Hello, Express!' khi truy cập đường dẫn /welcome. Vì vậy, câu trả lời đúng là 'The text "Hello, Express!"'.
Mở trang câu hỏi này →
142In Node with Express, how does `app.use(express.json())` affect requests?4 lựa chọnDễ100% trả lời đúng
AParses JSON bodies
BSets CORS headers
CHandles static file
DValidates routes
Lời giải

Trong Node với Express, `app.use(express.json())` có tác dụng giải quyết các yêu cầu JSON. Khi một yêu cầu được gửi đến ứng dụng Express, nó sẽ được kiểm tra xem có chứa dữ liệu JSON hay không. Nếu có, Express sẽ giải quyết dữ liệu đó thành một đối tượng JavaScript có thể sử dụng. Điều này cho phép bạn dễ dàng truy cập và xử lý dữ liệu JSON trong ứng dụng của mình. Ví dụ, nếu bạn có một yêu cầu POST với một cơ thể JSON như sau:

Lời giải
{
  "name": "John",
  "age": 30
}

, Express sẽ giải quyết nó thành một đối tượng như sau:

Lời giải
{
  name: 'John',
  age: 30
}

. Điều này giúp bạn dễ dàng truy cập và xử lý dữ liệu JSON trong ứng dụng của mình.

Mở trang câu hỏi này →
Đề bài
app.get('/', (req, res) => {
  throw new Error('Test error');
}

);

Đề bài
app.listen(3000);
AContinues serving other routes normally
BPasses to next error middleware if defined
CReturns default 500 with stack trace
DHalts the server until restarted
Lời giải
Khi một lỗi được ném trong một xử lý tuyến đường Express, ứng dụng Express sẽ tự động trả về trạng thái lỗi 500 với thông tin lỗi chi tiết. Điều này xảy ra vì Express sử dụng cơ chế middleware để xử lý các lỗi. Nếu một lỗi được ném trong một xử lý tuyến đường, Express sẽ tự động tìm kiếm middleware lỗi tiếp theo để xử lý. Nếu không có middleware lỗi nào được định nghĩa, Express sẽ tự động trả về trạng thái lỗi 500. Điều này giúp đảm bảo rằng ứng dụng luôn có thể trả về thông tin lỗi cho người dùng, ngay cả khi có lỗi xảy ra trong ứng dụng.
Mở trang câu hỏi này →
ARouter files like index.js and users.js
BTemplate files for views and layouts
CModel definitions for database interactions
DAsset folders for static content serving
Lời giải
Khi sử dụng Express Generator để tạo một ứng dụng Express mới, nó sẽ tự động tạo ra một số thư mục và tệp tin quan trọng. Trong thư mục `/routes`, Express Generator sẽ tạo ra các tệp tin router như `index.js` và `users.js`. Các tệp tin này chứa các hàm xử lý yêu cầu HTTP và trả về phản hồi cho các route tương ứng. Ví dụ, `index.js` có thể chứa hàm xử lý yêu cầu GET cho route `/` và trả về một trang chủ, trong khi `users.js` có thể chứa hàm xử lý yêu cầu GET cho route `/users` và trả về danh sách người dùng. Các tệp tin router này giúp phân tách logic ứng dụng và làm cho mã nguồn trở nên dễ đọc và dễ bảo trì hơn.
Mở trang câu hỏi này →