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

84/194 câuCòn 110
65Which of the following methods triggers a preflight request in CORS?4 lựa chọnDễ100% trả lời đúng
AGET
BPOST with Content-Type: application/json
CDELETE
DOPTIONS
Lời giải
Để xác định phương thức nào sẽ kích hoạt yêu cầu tiền kiểm tra (preflight request) trong CORS, chúng ta cần hiểu về cơ chế hoạt động của CORS. CORS (Cross-Origin Resource Sharing) là một cơ chế giúp cho các trang web có thể giao tiếp với nhau qua HTTP request, ngay cả khi chúng có nguồn gốc từ các miền khác nhau. Trong trường hợp này, khi một trang web muốn gửi một yêu cầu HTTP có phương thức khác GET (ví dụ như POST, PUT, DELETE) và có header hoặc body có chứa dữ liệu đặc biệt (ví dụ như Content-Type: application/json), thì trình duyệt sẽ kích hoạt một yêu cầu tiền kiểm tra trước khi gửi yêu cầu thực tế. Yêu cầu tiền kiểm tra này có phương thức là OPTIONS và sẽ chứa các thông tin về phương thức, header và body của yêu cầu thực tế.
Mở trang câu hỏi này →
66What are appropriate ways to secure a RESTful API?4 lựa chọnDễ100% trả lời đúng
AIncluding API keys in URL parameters
BUsing HTTPS for all communications
CDisabling CORS
DUsing JWT (JSON Web Tokens) for authentication
Lời giải
Để bảo mật một API RESTful, có nhiều phương pháp được sử dụng. Trước hết, việc sử dụng HTTPS cho tất cả các giao tiếp là một biện pháp quan trọng. Điều này giúp mã hóa dữ liệu được truyền qua internet, ngăn chặn việc nghe trộm và thay đổi dữ liệu. Ngoài ra, việc sử dụng JWT (JSON Web Tokens) cho xác thực cũng là một cách hiệu quả. JWT cho phép xác thực người dùng một cách an toàn và bảo mật, giảm thiểu rủi ro giả mạo tài khoản. Tuy nhiên, việc bao gồm API keys trong tham số URL không phải là một phương pháp bảo mật, vì nó có thể dễ bị lộ và bị đánh cắp. Việc vô hiệu hóa CORS (Cross-Origin Resource Sharing) cũng không phải là một biện pháp bảo mật, vì nó có thể gây ra các vấn đề về tương tác giữa các trang web khác nhau.
Mở trang câu hỏi này →
67What is the purpose of Dependency Injection in NestJS?4 lựa chọnDễ100% trả lời đúng
ATo make HTTP requests faster
BTo reduce memory usage
CTo manage and share resources efficiently between modules
DTo handle errors in controllers
Lời giải
Dependency Injection trong NestJS là một kỹ thuật giúp quản lý và chia sẻ tài nguyên một cách hiệu quả giữa các mô-đun. Nó cho phép các mô-đun phụ thuộc vào các dịch vụ hoặc đối tượng khác mà không cần phải tạo ra chúng một cách thủ công. Điều này giúp giảm bớt sự phức tạp trong mã nguồn và tăng cường khả năng tái sử dụng. Khi sử dụng Dependency Injection, các mô-đun có thể được thiết kế độc lập và dễ dàng thay thế mà không ảnh hưởng đến các mô-đun khác. Điều này giúp tăng cường tính linh hoạt và dễ dàng bảo trì hệ thống. Ngoài ra, Dependency Injection cũng giúp giảm thiểu sự phụ thuộc giữa các mô-đun, giúp hệ thống trở nên dễ dàng bảo trì và mở rộng hơn.
Mở trang câu hỏi này →
68Which decorator is used to inject a dependency into a service in NestJS?4 lựa chọnTrung bình50% trả lời đúng
A@Injectable
B@Inject
C@Service
D@Provider
Lời giải
Trong NestJS, để chèn một phụ thuộc vào một dịch vụ, bạn cần sử dụng decorator @Inject. Decorator này cho phép bạn truyền vào một đối tượng phụ thuộc vào một hàm hoặc một lớp. Điều này giúp bạn có thể dễ dàng quản lý và thay thế phụ thuộc trong ứng dụng của mình.
Mở trang câu hỏi này →
69What does the save() method do in Mongoose?4 lựa chọnDễ100% trả lời đúng
ADeletes a document
BValidates and inserts a document into the database
CUpdates a document in the database
DFinds a document in the database
Lời giải
Método save() trong Mongoose là một phương thức quan trọng trong việc tương tác với cơ sở dữ liệu MongoDB. Khi gọi phương thức này, nó sẽ kiểm tra dữ liệu được truyền vào xem có hợp lệ hay không. Nếu dữ liệu hợp lệ, nó sẽ thêm hoặc cập nhật một bản ghi mới vào cơ sở dữ liệu. Điều này bao gồm việc kiểm tra các ràng buộc và quy tắc đã được định nghĩa trong mô hình Mongoose. Phương thức save() cũng có thể được sử dụng để cập nhật một bản ghi hiện có trong cơ sở dữ liệu. Tóm lại, phương thức save() trong Mongoose có chức năng xác thực và thêm hoặc cập nhật một bản ghi vào cơ sở dữ liệu.
Mở trang câu hỏi này →
70How do you create a model in Mongoose?4 lựa chọnDễ75% trả lời đúng
Amongoose.define()
Bmongoose.Model()
Cmongoose.create()
Dmongoose.model()
Lời giải

Để tạo một mô hình trong Mongoose, bạn cần sử dụng phương thức mongoose.model(). Phương thức này cho phép bạn tạo một mô hình dựa trên một tập hợp các dữ liệu. Bạn cần cung cấp tên mô hình và một đối tượng mô tả cấu trúc dữ liệu. Ví dụ: const userSchema =

Lời giải
new mongoose.Schema({
  name: String, age: Number
}

); const User =

Lời giải
mongoose.model('User', userSchema);
Mở trang câu hỏi này →
71Which of the following is not a valid Mongoose data type?4 lựa chọnDễ100% trả lời đúng
AString
BNumber
CBoolean
DChar
Lời giải
Mongoose là một thư viện quan hệ cơ sở dữ liệu (ORM) được sử dụng để tương tác với cơ sở dữ liệu MongoDB. Trong Mongoose, có một số loại dữ liệu được hỗ trợ như String, Number, Boolean, Date, Array, Mixed, ObjectId, Buffer, Mixed và Map. Tuy nhiên, Char không phải là một loại dữ liệu được hỗ trợ bởi Mongoose. Thay vào đó, bạn có thể sử dụng String để lưu trữ các giá trị ký tự. Vì vậy, câu trả lời đúng cho câu hỏi này là Char.
Mở trang câu hỏi này →
Atoken
Bpassport
Ccookie
Dsession
Lời giải
Mỗi yêu cầu tiếp theo từ phía khách hàng nên bao gồm thông tin ______ trong tiêu đề yêu cầu. Thông tin này giúp máy chủ xác thực và xác minh tính hợp lệ của yêu cầu. Trong một số trường hợp, thông tin này có thể được sử dụng để lưu trữ thông tin về trạng thái phiên hoạt động của khách hàng. Ví dụ, trong một ứng dụng cần xác thực người dùng, thông tin này có thể là một token được tạo ra khi khách hàng đăng nhập thành công. Token này sẽ được gửi lại trong mỗi yêu cầu tiếp theo để máy chủ có thể xác thực và cung cấp thông tin cần thiết cho khách hàng.
Mở trang câu hỏi này →
73What is the primary purpose of JWT (JSON Web Token)?4 lựa chọnDễ100% trả lời đúng
AEncrypt user data
BAuthenticate and authorize users
CPerform database operations
DSend push notifications
Lời giải
JWT (JSON Web Token) là một loại token được sử dụng để xác thực và ủy quyền người dùng. Mục đích chính của JWT là cung cấp một cách bảo mật và an toàn để xác thực người dùng và cấp quyền truy cập vào các tài nguyên. JWT sử dụng một cơ chế ký số để đảm bảo tính toàn vẹn và bảo mật của thông tin được chứa trong token. Khi một người dùng đăng nhập vào hệ thống, hệ thống sẽ tạo ra một JWT chứa thông tin về người dùng và gửi nó về cho người dùng. Người dùng sẽ sử dụng JWT này để truy cập vào các tài nguyên được phép. JWT được sử dụng rộng rãi trong các ứng dụng web và di động để cung cấp một cách bảo mật và an toàn cho người dùng.
Mở trang câu hỏi này →
74Which protocol is commonly used for authentication in web applications?4 lựa chọnDễ100% trả lời đúng
AHTTP
BOAuth
CFTP
DSMTP
Lời giải
OAuth là một giao thức phổ biến được sử dụng cho việc xác thực trong các ứng dụng web. Nó cho phép người dùng cấp quyền cho các ứng dụng khác truy cập vào tài khoản của họ mà không cần phải nhập lại mật khẩu. OAuth hoạt động bằng cách cung cấp một token tạm thời cho ứng dụng, cho phép nó truy cập vào tài khoản người dùng mà không cần biết mật khẩu thực sự. Điều này giúp tăng cường bảo mật và giảm thiểu rủi ro bị xâm phạm thông tin cá nhân. Ngoài ra, OAuth cũng cho phép người dùng quản lý quyền truy cập của mình một cách linh hoạt, giúp họ có thể dễ dàng revoke quyền truy cập của ứng dụng nào đó nếu cần.
Mở trang câu hỏi này →
75Which HTTP method is used to retrieve data from a REST API?4 lựa chọnDễ100% trả lời đúng
APOST
BGET
CDELETE
DPUT
Lời giải
Để lấy dữ liệu từ một API REST, bạn cần sử dụng phương thức HTTP phù hợp. Trong các phương thức HTTP phổ biến như POST, GET, DELETE, PUT, thì phương thức GET là lựa chọn tốt nhất. Phương thức GET được sử dụng để yêu cầu dữ liệu từ một nguồn nào đó, thường được sử dụng để đọc dữ liệu mà không cần thay đổi nó. Ví dụ, khi bạn truy cập một trang web bằng đường dẫn URL, trình duyệt của bạn sẽ gửi một yêu cầu GET đến máy chủ để lấy dữ liệu trang web đó. Trong REST API, phương thức GET cũng được sử dụng tương tự, để lấy dữ liệu từ một nguồn nào đó. Vì vậy, phương thức GET là lựa chọn phù hợp để lấy dữ liệu từ một API REST.
Mở trang câu hỏi này →
76Which tool is commonly used to test RESTful APIs?4 lựa chọnDễ100% trả lời đúng
ANode.js
BPostman
CMongoDB Compass
DExpress.js
Lời giải
Để kiểm tra các API RESTful, chúng ta thường sử dụng các công cụ hỗ trợ. Trong số các lựa chọn trên, công cụ được sử dụng phổ biến nhất là Postman. Postman là một ứng dụng web và ứng dụng di động cho phép người dùng gửi yêu cầu HTTP và xem phản hồi từ các API. Nó cung cấp một giao diện người dùng thân thiện và dễ sử dụng, giúp người dùng dễ dàng tạo và gửi các yêu cầu HTTP, chẳng hạn như GET, POST, PUT và DELETE. Ngoài ra, Postman cũng cho phép người dùng lưu trữ và quản lý các yêu cầu HTTP, cũng như tạo và quản lý các môi trường thử nghiệm.
Mở trang câu hỏi này →
A[String]
B{ type: String }
C{ type: Schema.Types.ObjectId, ref: 'SubDoc' }
D[Schema.Types.Mixed]
Lời giải
Để định nghĩa một tham chiếu đến một tài liệu con trong Mongoose, bạn cần sử dụng loại dữ liệu ObjectId và tham số ref. Tham số ref được sử dụng để chỉ định tên của tài liệu con mà bạn muốn tham chiếu đến. Ví dụ, nếu bạn muốn tham chiếu đến một tài liệu con có tên là 'SubDoc', bạn sẽ sử dụng { type: Schema.Types.ObjectId, ref: 'SubDoc' }. Điều này cho phép Mongoose tự động tạo ra các liên kết giữa các tài liệu và thực hiện các hoạt động CRUD (Tạo, Đọc, Cập nhật, Xóa) một cách dễ dàng.
Mở trang câu hỏi này →
78Which of the following are valid ways to define a Mongoose schema with timestamps?4 lựa chọnTrung bình60% trả lời đúng
Anew Schema({ fieldName: String }, { timestamps: true })
Bnew Schema({ fieldName: { type: String, timestamps: true } })
Cnew Schema({ fieldName: String }, { timestamps: false })
Dnew Schema({ fieldName: String }).set('timestamps', true)
Lời giải

Để định nghĩa một schema Mongoose với timestamps, có hai cách hợp lệ. Trước hết, bạn có thể sử dụng phương thức constructor với tham số thứ hai là một đối tượng chứa tùy chọn. Ví dụ:

Lời giải
new Schema({
  fieldName: String
}

, { timestamps: true }). Thứ hai, bạn có thể sử dụng phương thức set() để thêm tùy chọn timestamps vào schema đã tồn tại. Ví dụ:

Lời giải
new Schema({
  fieldName: String
}

).set('timestamps', true).

Mở trang câu hỏi này →
Đề bài
new Schema({
  name: String, email: String, age: Number, createAt: String
}

); const User = mongoose.model('User', userSchema); Which right document is saved in MongoDB with above mongoose?

Aage stored as Number 24 and createAt stored as String '20/4/2020' (consistent casting)
Bage stored as string '24' in one document (inconsistent)
Cage stored as string '24' in one document (inconsistent)
D(option cut off in image)
Lời giải
Mô tả về cách lưu trữ dữ liệu trong MongoDB khi sử dụng Mongoose. Trong đoạn mã trên, chúng ta có thể thấy rằng dữ liệu được lưu trữ trong MongoDB theo định dạng của Schema. Đối với trường 'age', nó được định nghĩa là một số nguyên (Number) nên khi lưu trữ dữ liệu, nó sẽ được lưu trữ dưới dạng số nguyên. Đối với trường 'createAt', nó được định nghĩa là một chuỗi (String) nên khi lưu trữ dữ liệu, nó sẽ được lưu trữ dưới dạng chuỗi. Vì vậy, khi chúng ta lưu trữ dữ liệu vào MongoDB, trường 'age' sẽ được lưu trữ dưới dạng số nguyên 24 và trường 'createAt' sẽ được lưu trữ dưới dạng chuỗi '20/4/2020'. Điều này cho thấy rằng dữ liệu được lưu trữ một cách nhất quán (consistent) với định dạng của Schema. Vì vậy, đáp án đúng là: 'age stored as Number 24 and createAt stored as String '20/4/2020' (consistent casting)'
Mở trang câu hỏi này →
80Which statements correctly describe the benefits of Mongoose population?4 lựa chọnDễ86% trả lời đúng
APopulation makes the code cleaner and more intuitive when dealing with related data.
BPopulation makes it harder to read and understand the code.
CPopulation reduces the need for multiple round trips to the database.
DPopulation can only be used with single-level documents.
Lời giải
Mongoose population là một tính năng mạnh mẽ giúp bạn dễ dàng quản lý dữ liệu liên quan trong MongoDB. Khi sử dụng population, bạn có thể dễ dàng truy cập và xử lý dữ liệu liên quan mà không cần phải viết nhiều mã code phức tạp. Điều này giúp code của bạn trở nên sạch sẽ và dễ hiểu hơn khi xử lý dữ liệu liên quan. Ngoài ra, population còn giúp giảm thiểu số lần yêu cầu đến cơ sở dữ liệu, từ đó cải thiện hiệu suất và tốc độ của ứng dụng. Tuy nhiên, population không phải là một tính năng bắt buộc và bạn có thể chọn sử dụng nó tùy thuộc vào nhu cầu của dự án.
Mở trang câu hỏi này →
Apassport.authenticate()
Bpassport.serializeUser()
Cpassport.session()
Dpassport.login()
Lời giải
Để cấu hình Passport serialize thông tin người dùng vào phiên, chúng ta cần sử dụng hàm passport.serializeUser(). Hàm này được sử dụng để chuyển đổi thông tin người dùng thành một dạng có thể lưu trữ trong phiên. Thông thường, thông tin người dùng được chuyển đổi thành một chuỗi ID người dùng. Sau đó, khi người dùng đăng nhập, Passport sẽ lưu trữ ID người dùng vào phiên và sử dụng nó để xác thực người dùng trong các yêu cầu tiếp theo. Hàm passport.serializeUser() là một phần quan trọng trong quá trình xác thực người dùng bằng Passport.
Mở trang câu hỏi này →
82What is one of the main benefits of using Mongoose population?4 lựa chọnDễ100% trả lời đúng
AIt simplifies data retrieval by allowing related data to be retrieved in a single query.
BIt increases the complexity of the code.
CIt removes the need for schemas.
DIt disables validation.
Lời giải
Mongoose population là một tính năng mạnh mẽ giúp bạn có thể lấy dữ liệu liên quan một cách dễ dàng và hiệu quả. Khi sử dụng Mongoose population, bạn có thể lấy được dữ liệu liên quan trong một truy vấn duy nhất, thay vì phải thực hiện nhiều truy vấn riêng biệt. Điều này giúp giảm thiểu số lượng truy vấn và tăng tốc độ lấy dữ liệu, đồng thời cũng giúp giảm thiểu lượng dữ liệu phải xử lý. Ngoài ra, Mongoose population cũng giúp bạn có thể lấy được dữ liệu liên quan một cách linh hoạt và dễ dàng, giúp bạn có thể xây dựng các ứng dụng phức tạp và hiệu quả hơn.
Mở trang câu hỏi này →
83Consider the following code snippet4 lựa chọncó codeDễ70% trả lời đúng
Đề bài
using async/await: async function fetchData() {
  try {
    let response = await fetch('https://api.example.com/data');
    let data = await response.json();
    console.log(data);
  }
  catch (error) {
    console.error('Error:', error);
  }
}

fetchData(); What are the advantages of using async/await in this code?

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
Sử dụng async/await trong mã nguồn này mang lại nhiều lợi ích. Trước hết, nó giúp mã nguồn trở nên dễ đọc và dễ hiểu hơn. Điều này là do async/await cho phép chúng ta viết mã nguồn theo trình tự thời gian thực, giống như viết mã nguồn đồng bộ. Điều này giúp giảm thiểu sự phức tạp và khó hiểu của mã nguồn. Ngoài ra, async/await cũng giúp đơn giản hóa việc xử lý lỗi bằng cách sử dụng khối try/catch. Khi sử dụng async/await, chúng ta có thể dễ dàng bắt và xử lý lỗi bằng cách sử dụng khối try/catch, thay vì phải sử dụng các hàm callback phức tạp. Điều này giúp giảm thiểu sự phức tạp và khó hiểu của mã nguồn. Tuy nhiên, async/await không loại bỏ hoàn toàn nhu cầu sử dụng hàm callback. Trong một số trường hợp, chúng ta vẫn cần sử dụng hàm callback để xử lý các tác vụ phức tạp. Vì vậy, async/await không phải là giải pháp hoàn hảo, nhưng nó là một công cụ mạnh mẽ giúp chúng ta viết mã nguồn dễ đọc, dễ hiểu và dễ bảo trì.
Mở trang câu hỏi này →
84How 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 →