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

164/194 câuCòn 30
Đề bài
if (!req.headers['x-auth']) {
  return next(new Error('Missing auth header'));
}

next(); };

Đề bài
app.use(checkAuth);
app.get('/api/data', (req, res) => {
  res.json({
    data: 'Secret'
  }
  );
}

);

Đề bài
app.use((err, req, res, next) => {
  res.status(401).json({
    error: err.message
  }
  );
}

); app.listen(3000); Assume the request has no `x-auth` header.

A{ data: 'Secret' }
B{ error: 'Missing auth header' }
C400 with { error: 'Bad Request' }
DThrows an uncaught error
Lời giải
Khi thực hiện một yêu cầu GET đến địa chỉ http://localhost:3000/api/data trong ứng dụng Express này, ứng dụng sẽ kiểm tra xem yêu cầu có chứa tiêu đề 'x-auth' hay không. Vì yêu cầu không có tiêu đề 'x-auth', nên ứng dụng sẽ gọi hàm checkAuth và hàm này sẽ trả về lỗi với thông điệp 'Missing auth header'. Sau đó, ứng dụng sẽ sử dụng middleware cuối cùng để trả về trạng thái 401 và nội dung lỗi với thông điệp 'Missing auth header'.
Mở trang câu hỏi này →
Đề bài
app.get('/info', (req, res) => {
  res.send('Information');
}

);

Đề bài
app.listen(3000);
AInformation
BStandard 404 for unmatched routes elsewhere
CSends custom message based on path match
DEmpty if no content specified in handler
Lời giải
Khi gửi một yêu cầu GET đến đường dẫn "/info" trong ứng dụng Express này, ứng dụng sẽ trả về thông tin "Information". Điều này là vì trong mã nguồn, chúng ta đã định nghĩa một hàm xử lý yêu cầu GET đến đường dẫn "/info" bằng cách sử dụng phương thức `app.get()`. Trong hàm này, chúng ta sử dụng phương thức `res.send()` để trả về thông tin "Information" cho người dùng. Điều này cho thấy ứng dụng sẽ trả về thông tin này bất kể người dùng gửi yêu cầu GET đến đường dẫn "/info" như thế nào.
Mở trang câu hỏi này →
147Which is the correct order of middleware execution in Express.js?4 lựa chọnTrung bình56% trả lời đúng
ADefined order in code
BAlphabetical order
CBased on request type
DRandom order
Lời giải

Trong Express.js, trình trung gian (middleware) được thực hiện theo một trình tự nhất định. Trình tự này được xác định bởi vị trí của chúng trong mã nguồn. Điều này có nghĩa là trình trung gian được định nghĩa trước sẽ được thực hiện trước trình trung gian được định nghĩa sau. Ví dụ, nếu bạn có một ứng dụng Express.js với hai trình trung gian được định nghĩa như sau:

Lời giải
app.use(express.json());
app.use(logger('dev'));

Thì trình trung gian express.json() sẽ được thực hiện trước trình trung gian logger('dev'). Điều này giúp đảm bảo rằng dữ liệu được xử lý một cách nhất quán và chính xác. Do đó, trình tự thực hiện của trình trung gian trong Express.js là dựa trên vị trí của chúng trong mã nguồn, không phải theo thứ tự từ A-Z, dựa trên loại yêu cầu hoặc ngẫu nhiên.

Mở trang câu hỏi này →
148Which method is used in Express to serve static files?4 lựa chọnTrung bình67% trả lời đúng
Aapp.static()
Bexpress.static()
Cstatic.use()
Dapp.serveStatic()
Lời giải
Để phục vụ các tệp tin tĩnh trong Express, bạn cần sử dụng phương thức express.static(). Phương thức này cho phép bạn chỉ định thư mục chứa các tệp tin tĩnh mà bạn muốn phục vụ. Ví dụ, nếu bạn muốn phục vụ các tệp tin tĩnh trong thư mục 'public', bạn có thể sử dụng mã sau: app.use(express.static('public')). Phương thức express.static() là một trong những phương thức mạnh mẽ và phổ biến nhất trong Express để phục vụ các tệp tin tĩnh.
Mở trang câu hỏi này →
Aapp.use(express.static(__dirname + '/public'));
Bapp.use(morgan('dev'));
Capp.use(express.json());
Dapp.use((req, res) => { res.send('Logging'); });
Lời giải
Để chọn middleware phù hợp cho ứng dụng Express cần ghi nhật ký tất cả các yêu cầu HTTP, chúng ta cần sử dụng middleware morgan. Middleware morgan là một trong những middleware phổ biến nhất được sử dụng để ghi nhật ký các yêu cầu HTTP. Nó cho phép chúng ta tùy chọn mức độ chi tiết của nhật ký, chẳng hạn như 'combined', 'common', 'dev', 'short', 'tiny', v.v. Trong trường hợp này, chúng ta chọn 'dev' để có nhật ký chi tiết hơn. Middleware morgan sẽ ghi nhật ký các yêu cầu HTTP vào console, bao gồm thông tin như thời gian yêu cầu, phương thức yêu cầu, URL yêu cầu, v.v. Điều này giúp chúng ta dễ dàng theo dõi và debug ứng dụng Express.
Mở trang câu hỏi này →
Đề bài
class and connecting to the server. const {
  MongoClient
}

= require('mongodb'); const url = 'mongodb://localhost:27017'; const dbName = 'mydatabase'; const client =

Đề bài
new MongoClient(url);
async function run() {
  try {
    await client.connect();
    console.log("Connected correctly to server");
    const db = client.db(dbName);
  }
  finally {
    await client.close();
  }
}

run().catch(console.dir);

Aconst { MongoClient } = require('mongodb'); is responsible for importing the MongoClient class.
Bconst url = 'mongodb://localhost:27017'; is responsible for setting the database name.
Cawait client.connect(); is responsible for connecting to the MongoDB server.
Dconst db = client.db(dbName); is responsible for closing the connection to the MongoDB server.
Lời giải

Để kết nối đến một server MongoDB, chúng ta cần sử dụng MongoClient class. Trong đoạn mã này, phần import MongoClient class được thực hiện bởi câu lệnh const { MongoClient } = require('mongodb');. Sau đó, chúng ta cần cung cấp thông tin kết nối đến server MongoDB, bao gồm địa chỉ và tên cơ sở dữ liệu. Câu lệnh const url = 'mongodb://localhost:27017'; được sử dụng để thiết lập địa chỉ server MongoDB, trong khi câu lệnh const dbName = 'mydatabase'; được sử dụng để thiết lập tên cơ sở dữ liệu. Để kết nối đến server MongoDB, chúng ta sử dụng phương thức connect() của MongoClient, được thực hiện bởi câu lệnh await client.connect();. Cuối cùng, để đóng kết nối đến server MongoDB, chúng ta sử dụng phương thức close() của MongoClient, được thực hiện bởi câu lệnh await client.close();.

Mở trang câu hỏi này →
ACreating separate documents for related data
BNormalize your data
CUse data types efficiently
DStore large binary data in documents
Lời giải
Để tránh vượt quá giới hạn 16 MB của MongoDB, bạn cần tối ưu hóa mô hình dữ liệu của mình. Một trong những cách hiệu quả là tạo ra các tài liệu riêng biệt cho dữ liệu liên quan. Điều này giúp giảm thiểu kích thước của mỗi tài liệu và tránh tình trạng vượt quá giới hạn. Ngoài ra, bạn cũng có thể áp dụng nguyên tắc phân chia dữ liệu (Normalization) để tổ chức dữ liệu một cách hợp lý và hiệu quả. Cuối cùng, việc sử dụng các loại dữ liệu một cách hiệu quả cũng là một yếu tố quan trọng trong việc tối ưu hóa mô hình dữ liệu của bạn.
Mở trang câu hỏi này →
AThe operation fails
BMongoDB generates an ObjectId automatically
CThe document cannot be queried later
DIt is inserted with _id: null
Lời giải
Khi bạn thử chèn một tài liệu vào MongoDB mà không chỉ định _id, MongoDB sẽ tự động tạo một ObjectId cho tài liệu đó. ObjectId là một chuỗi duy nhất được tạo bởi MongoDB để nhận dạng tài liệu. Việc tạo ObjectId tự động giúp đảm bảo rằng mỗi tài liệu trong cơ sở dữ liệu đều có một khóa chính duy nhất. Điều này rất quan trọng trong việc quản lý và truy vấn dữ liệu. Ngoài ra, việc tạo ObjectId tự động cũng giúp tránh được trường hợp trùng lặp tài liệu. Vì vậy, nếu bạn không chỉ định _id khi chèn tài liệu, MongoDB sẽ tự động tạo một ObjectId cho tài liệu đó.
Mở trang câu hỏi này →
AKey-Value Store
BDocument-Based Store
CColumn-Based Store
DGraph-Based Store
Lời giải
Một ứng dụng cần ưu tiên mối quan hệ giữa các thực thể dữ liệu, thì loại cơ sở dữ liệu NoSQL phù hợp nhất sẽ là Graph-Based Store. Cơ sở dữ liệu này cho phép lưu trữ dữ liệu dưới dạng đồ thị, nơi mà mỗi nút (node) đại diện cho một thực thể dữ liệu và mỗi cạnh (edge) đại diện cho mối quan hệ giữa các thực thể. Điều này cho phép thực hiện các phép toán đồ thị như tìm kiếm theo đường đi ngắn nhất, tìm kiếm các nút có liên quan, v.v. Mô hình đồ thị này rất phù hợp cho các ứng dụng cần quản lý các mối quan hệ phức tạp giữa các thực thể dữ liệu.
Mở trang câu hỏi này →
154Which statements correctly describe CRUD operations in MongoDB?4 lựa chọnTrung bình60% trả lời đúng
Afind is used to retrieve documents from a collection.
BupdateOne is used to delete a single document from a collection.
CdeleteMany is used to delete multiple documents from a collection.
DinsertMany is used to update multiple documents in a collection.
Lời giải
CRUD (Create, Read, Update, Delete) là các phương thức cơ bản để tương tác với dữ liệu trong MongoDB. Trong đó, CRUD bao gồm các phương thức sau: Find (Tìm kiếm) - được sử dụng để lấy ra các tài liệu từ một tập hợp dữ liệu. UpdateOne (Cập nhật một) - được sử dụng để cập nhật một tài liệu trong một tập hợp dữ liệu. DeleteMany (Xóa nhiều) - được sử dụng để xóa nhiều tài liệu trong một tập hợp dữ liệu. InsertMany (Chèn nhiều) - được sử dụng để chèn nhiều tài liệu vào một tập hợp dữ liệu. Vì vậy, các câu trả lời đúng cho câu hỏi này là: Find được sử dụng để lấy ra các tài liệu từ một tập hợp dữ liệu và DeleteMany được sử dụng để xóa nhiều tài liệu từ một tập hợp dữ liệu.
Mở trang câu hỏi này →
155Which statements correctly describe the use of regex in MongoDB?4 lựa chọnDễ100% trả lời đúng
ARegex can be used in the $regex operator to match string patterns.
BRegex is used to perform mathematical operations.
CRegex allows for case-insensitive searches by using the 'i' option.
DRegex can be used to insert documents into a collection.
Lời giải
Regex trong MongoDB được sử dụng để tìm kiếm và xử lý chuỗi dữ liệu. Theo đó, bạn có thể sử dụng $regex operator để tìm kiếm các mẫu chuỗi. Ví dụ, bạn có thể sử dụng $regex để tìm kiếm các chuỗi bắt đầu bằng 'abc' hoặc kết thúc bằng 'xyz'. Ngoài ra, regex cũng cho phép bạn thực hiện các tìm kiếm không phân biệt chữ hoa chữ thường bằng cách sử dụng tùy chọn 'i'. Điều này có nghĩa là bạn có thể tìm kiếm các chuỗi mà không cần quan tâm đến việc chữ cái được viết hoa hay viết thường. Tuy nhiên, regex không được sử dụng để thực hiện các phép toán toán học, cũng như không được sử dụng để chèn dữ liệu vào một collection.
Mở trang câu hỏi này →
ANoSQL databases guarantee immediate data consistency across all nodes
BNoSQL databases support flexible schemas for rapidly changing data
CNoSQL databases enforce foreign key constraints for data integrity
DNoSQL databases are optimized for complex joins across multiple tables
Lời giải
Một nhà phát triển có thể chọn một cơ sở dữ liệu NoSQL như MongoDB thay vì cơ sở dữ liệu SQL để ứng dụng phân tích thời gian thực vì một số lý do. Cơ sở dữ liệu NoSQL cho phép sử dụng cấu trúc dữ liệu linh hoạt, phù hợp với dữ liệu thay đổi nhanh chóng. Điều này giúp giảm thiểu thời gian và công sức khi thiết kế và triển khai cơ sở dữ liệu. Ngoài ra, cơ sở dữ liệu NoSQL thường có khả năng mở rộng tốt hơn, cho phép xử lý lượng dữ liệu lớn và nhanh chóng. Điều này đặc biệt quan trọng trong ứng dụng phân tích thời gian thực, nơi dữ liệu được cập nhật liên tục và cần được xử lý nhanh chóng để cung cấp thông tin chính xác và kịp thời.
Mở trang câu hỏi này →
157In Mongoose, which method is used to create a new document?4 lựa chọnTrung bình63% trả lời đúng
AModel.find()
BModel.insert()
CModel.save()
Dnew Model().save()
Lời giải

Trong Mongoose, phương thức được sử dụng để tạo một tài liệu mới là new Model().save(). Phương thức này cho phép bạn tạo một tài liệu mới và lưu nó vào cơ sở dữ liệu. Phương thức này được sử dụng khi bạn muốn tạo một tài liệu mới và không muốn dựa vào dữ liệu hiện có trong cơ sở dữ liệu. Ví dụ, nếu bạn muốn tạo một tài liệu mới với các trường dữ liệu cụ thể, bạn có thể sử dụng phương thức new Model().save() như sau: const user =

Lời giải
new User({
  name: 'John Doe', email: 'john@example.com'
}

);

Lời giải
user.save((err, user) => {
  if (err) console.error(err); else console.log(user);
}

);

Mở trang câu hỏi này →
158What is a model in Mongoose?4 lựa chọnDễ88% trả lời đúng
AA method for querying the database.
BA schema used for validating documents.
CAn object that takes your schema and applies it to each document in its collection.
DA function used for database transactions.
Lời giải
Trong Mongoose, một mô hình (model) là một đối tượng được tạo ra từ một schema. Nó có nhiệm vụ áp dụng schema vào từng bản ghi (document) trong một tập hợp dữ liệu (collection). Mô hình được sử dụng để tương tác với cơ sở dữ liệu, bao gồm việc tạo, đọc, cập nhật và xóa dữ liệu. Khi tạo một mô hình, bạn cần cung cấp tên của tập hợp dữ liệu và schema được sử dụng để xác định cấu trúc của dữ liệu. Mô hình sẽ tự động tạo ra các phương thức để thực hiện các hành động cơ bản trên dữ liệu, như tìm kiếm, tạo mới, cập nhật và xóa.
Mở trang câu hỏi này →
AMongoose automatically shards collections for scalability
BMongoose provides schema validation and middleware for data modeling
CMongoose eliminates the need for a MongoDB server
DMongoose supports SQL queries for relational data
Lời giải
Sử dụng Mongoose ODM thay vì driver MongoDB Node.js gốc mang lại một lợi ích chính là cung cấp xác thực schema và middleware cho mô hình dữ liệu. Điều này giúp đảm bảo dữ liệu được nhập vào cơ sở dữ liệu có cấu trúc và hợp lệ, giảm thiểu khả năng xảy ra lỗi do dữ liệu không đúng định dạng. Mongoose cũng cung cấp các tính năng như tạo index, thực hiện các thao tác CRUD (Create, Read, Update, Delete) dữ liệu một cách dễ dàng và hiệu quả. Ngoài ra, Mongoose hỗ trợ các tính năng như middleware, hooks và các tính năng khác giúp phát triển ứng dụng trở nên linh hoạt và mạnh mẽ hơn.
Mở trang câu hỏi này →
160What is the output of this Mongoose code4 lựa chọncó codeDễ86% trả lời đúng
Đề bài
if validation fails? const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/db');

const schema =

Đề bài
new mongoose.Schema({
  age: {
    type: Number, min: 18
  }
}

); const Model =

Đề bài
mongoose.model('Model', schema);
async function run() {
  try {
    await Model.create({
      age: 17
    }
    );
  }
  catch (err) {
    console.log('Validation error');
  }
}

run();

AValidation error
BSaves document with default values if possible
CHandles error and continues execution silently
DLogs schema min violation details
Lời giải
Khi mã Mongoose gặp lỗi xác thực, nó sẽ tự động tạo ra một lỗi và dừng việc thực hiện. Trong trường hợp này, khi tạo một tài liệu với độ tuổi 17, Mongoose sẽ phát hiện ra rằng độ tuổi này không đáp ứng được yêu cầu tối thiểu là 18. Do đó, nó sẽ tạo ra một lỗi và in ra 'Validation error' lên console.
Mở trang câu hỏi này →
Đề bài
app.use(express.json());
mongoose.connect('mongodb://localhost:27017/test', {
  useNewUrlParser: true
}

); const userSchema =

Đề bài
new mongoose.Schema({
  name: String, email: String
}

); const User =

Đề bài
mongoose.model('User', userSchema);
app.post('/api/users', async (req, res) => {
  try {
    const user = await User.create(req.body); res.status(201).json(user);
  }
  catch (err) {
    res.status(400).json({
      error: err.message
    }
    );
  }
}

);

Đề bài
app.listen(3000);
A201 with { _id: "...", name: "Alice", email: "alice@example.com" }
B400 with { error: "Validation failed" }
C500 with { error: "Internal Server Error" }
DThrows an unhandled promise rejection
Lời giải
Khi thực hiện yêu cầu POST đến địa chỉ http://localhost:3000/api/users với cơ thể yêu cầu là { "name": "Alice", "email": "alice@example.com" } trong ứng dụng Express này, ứng dụng sẽ tạo một tài khoản mới trong cơ sở dữ liệu MongoDB dựa trên dữ liệu được gửi. Nếu quá trình tạo tài khoản thành công, ứng dụng sẽ trả về trạng thái 201 Created và thông tin về tài khoản mới được tạo, bao gồm ID, tên và địa chỉ email. Nếu quá trình tạo tài khoản gặp lỗi, ứng dụng sẽ trả về trạng thái 400 Bad Request và thông điệp lỗi.
Mở trang câu hỏi này →
162What keyword is used in a schema to define a reference for population?4 lựa chọnDễ75% trả lời đúng
Aref
Blink
Cpopulate
Djoin
Lời giải
Trong khi xây dựng schema, để định nghĩa một tham chiếu cho dân số, chúng ta sử dụng từ khóa nào? Câu trả lời đúng là "ref". Từ khóa "ref" được sử dụng để chỉ định một tham chiếu đến một tài nguyên khác trong schema. Điều này cho phép chúng ta định nghĩa một mối quan hệ giữa các tài nguyên khác nhau. Ví dụ, nếu chúng ta có một tài nguyên "users" và một tài nguyên "orders", chúng ta có thể sử dụng từ khóa "ref" để định nghĩa một tham chiếu từ "orders" đến "users". Điều này giúp chúng ta xây dựng một schema phức tạp và linh hoạt hơn.
Mở trang câu hỏi này →
163Which command is used to install Mongoose in a Node.js project?4 lựa chọnDễ100% trả lời đúng
Anpm get mongoose
Bnpm i mongoose
Cmongoose install
Dnode install mongoose
Lời giải
Để cài đặt Mongoose trong một dự án Node.js, bạn cần sử dụng lệnh npm i mongoose. Lệnh này sẽ tải xuống và cài đặt Mongoose cùng với các phụ thuộc khác cần thiết. Mongoose là một trong những thư viện quan trọng nhất trong Node.js, giúp bạn tương tác với cơ sở dữ liệu MongoDB một cách dễ dàng. Để sử dụng Mongoose, bạn cần cài đặt nó trước khi bắt đầu phát triển ứng dụng của mình. Lệnh npm i mongoose là một phần quan trọng trong quy trình cài đặt Mongoose và cần được thực hiện một cách chính xác để đảm bảo ứng dụng của bạn hoạt động đúng cách.
Mở trang câu hỏi này →
Adefault: 18
Brequired: true
Cvalidate: {}
Dimmutable: true
Lời giải
Để xác minh giá trị trong Mongoose schema, bạn cần sử dụng một trong các cấu hình sau. Cấu hình 'required: true' chỉ yêu cầu trường đó phải có giá trị, nhưng không kiểm tra giá trị đó có hợp lệ hay không. Để kiểm tra giá trị, bạn cần sử dụng 'validate: {}', nơi bạn có thể xác định các quy tắc kiểm tra giá trị. Ví dụ, bạn có thể xác định giá trị mặc định, hoặc xác định giá trị hợp lệ cho trường đó. Cấu hình 'immutable: true' chỉ cho phép trường đó không được thay đổi sau khi được tạo, nhưng không liên quan đến việc xác minh giá trị.
Mở trang câu hỏi này →