Danh sách câu hỏi của đề

Câu hỏi: SDN302 Server-Side development with NodeJS, Express, and MongoDB – Bộ ôn tập cuối kỳ số 3

50 câu trắc nghiệm kèm lời giải của môn Server-Side development with NodeJS, Express, and MongoDB, xếp đúng thứ tự trong đề. Trang 2/3 — câu 21–40.

Danh sách câu hỏi

40/50 câuCòn 10
Đề bài
const express = require('express');
// Example from generated route
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

Đáp án đúng: "Router files like index.js and users.js". Express Generator (lệnh npx express-generator) dựng khung dự án gồm app.js, bin/www và các thư mục public, views, routes; trong routes có hai tệp index.js và users.js, mỗi tệp gọi express.Router(), khai báo route rồi xuất router ra để app.js gắn bằng app.use('/', indexRouter) và app.use('/users', usersRouter). "Template files for views and layouts" nằm ở thư mục views (như index.jade, layout.jade, hoặc tệp .ejs khi chọn engine EJS), không ở routes. "Model definitions for database interactions" sai vì Express Generator không sinh tầng model hay kết nối cơ sở dữ liệu nào, lập trình viên tự thêm. "Asset folders for static content serving" nằm ở thư mục public (images, javascripts, stylesheets), được phục vụ qua express.static.

Mở trang câu hỏi này →
ATo manage database connections.
BTo create HTTP servers and make HTTP requests.
CTo handle file system operations.
DTo compile and run TypeScript code.
Lời giải
Đáp án đúng: "To create HTTP servers and make HTTP requests.". Module lõi http của Node.js cung cấp http.createServer() để dựng máy chủ lắng nghe yêu cầu, với callback nhận req và res, và http.request() hoặc http.get() để gửi yêu cầu HTTP tới máy chủ khác; Express thực chất được xây trên chính module này. "To manage database connections." sai vì kết nối cơ sở dữ liệu do driver riêng như mongodb hay mongoose lo. "To handle file system operations." là việc của module fs, như fs.readFile hay fs.writeFile. "To compile and run TypeScript code." sai vì Node.js không dùng module http để biên dịch TypeScript; việc đó do trình biên dịch tsc hoặc công cụ như ts-node đảm nhận.
Mở trang câu hỏi này →
ADesigned for traditional monolith applications
BFocused on real-time messaging systems
CLightweight and optimized for serverless environments
DBuilt-in NoSQL database engine
Lời giải
Đáp án đúng: "Lightweight and optimized for serverless environments". Hono là web framework nhỏ gọn dựng trên chuẩn Web (Request, Response, Fetch API), chạy được trên nhiều runtime như Cloudflare Workers, Deno, Bun, AWS Lambda và cả Node.js; bộ định tuyến nhanh, gói rất nhẹ và khởi động nhanh nên hợp với môi trường serverless và edge, nơi mỗi lần khởi động lạnh đều tốn thời gian. "Designed for traditional monolith applications" sai vì thế mạnh của Hono là chạy gọn ở edge, không phải phục vụ ứng dụng nguyên khối truyền thống, dù vẫn có thể dùng làm máy chủ thường. "Focused on real-time messaging systems" sai vì Hono là framework HTTP tổng quát; có hỗ trợ WebSocket qua helper nhưng nhắn tin thời gian thực không phải trọng tâm. "Built-in NoSQL database engine" sai vì Hono không kèm cơ sở dữ liệu nào, dữ liệu phải lấy từ dịch vụ ngoài.
Mở trang câu hỏi này →
ATo store user credentials securely on the server
BTo allow the client to access protected resources on behalf of the user
CTo validate the client’s redirect URI during authorization
DTo refresh the user’s session without re-authentication
Lời giải
Đáp án đúng: "To allow the client to access protected resources on behalf of the user". Trong OAuth 2.0, sau khi người dùng đồng ý trên authorization server, ứng dụng client nhận access token (mã truy cập) và gửi nó trong header Authorization dạng Bearer khi gọi resource server; token mang phạm vi quyền (scope) và thời hạn ngắn, cho phép client thay mặt người dùng truy cập tài nguyên được bảo vệ mà không cần biết mật khẩu của họ. "To store user credentials securely on the server" sai vì mục đích của OAuth là tránh việc chia sẻ thông tin đăng nhập, token không phải nơi chứa mật khẩu. "To validate the client’s redirect URI during authorization" là việc authorization server tự làm bằng cách so redirect URI với danh sách đã đăng ký, diễn ra trước khi có access token. "To refresh the user’s session without re-authentication" là vai trò của refresh token, loại token dùng để xin access token mới khi token cũ hết hạn.
Mở trang câu hỏi này →
AFunctions executed between request arrival and final response
BFiles storing database credentials
CHTML templates for rendering pages
DMethods used only for authentication
Lời giải
Đáp án đúng: "Functions executed between request arrival and final response". Middleware trong Express là hàm nhận req, res, next, chạy theo thứ tự khai báo bằng app.use hay trong route, sau khi request tới và trước khi phản hồi cuối được gửi; mỗi hàm có thể đọc, sửa req và res, kết thúc chu trình bằng res.send, hoặc gọi next() để chuyển cho hàm kế tiếp, ví dụ express.json(), cors() hay hàm ghi log. "Files storing database credentials" sai vì thông tin kết nối thường nằm trong tệp .env hay tệp cấu hình, không phải middleware. "HTML templates for rendering pages" là view của template engine như EJS, Pug, được gọi qua res.render. "Methods used only for authentication" sai ở chữ only: xác thực chỉ là một ứng dụng của middleware, bên cạnh phân tích body, CORS, ghi log, xử lý lỗi.
Mở trang câu hỏi này →
Đề bài
const express = require('express');
const app = express();
const logger = (req, res, next) => {
  req.log = `${req.method} ${req.url}`;
  next();
};
const restrict = (req, res, next) => {
  if (!req.query.token) {
    res.status(403).send('Forbidden');
  } else {
    next();
  }
};
app.use(logger);
app.get('/profile', restrict, (req, res) => {
  res.json({ log: req.log, user: 'Alice' });
});
app.listen(3000);
A{ log: 'GET /profile', user: 'Alice' }
B403 status with 'Forbidden'
C{ user: 'Alice' }
DThrows an error due to undefined `req.log`
Lời giải
Đáp án đúng: "{ log: 'GET /profile', user: 'Alice' }". Lần theo mã: app.use(logger) chạy với mọi yêu cầu, gán req.log bằng method nối với url rồi gọi next(); route GET /profile có middleware restrict đứng trước handler, vì yêu cầu kèm ?token=xyz nên req.query.token là xyz, khác rỗng, restrict gọi next(); handler cuối trả res.json với log lấy từ req.log và user là Alice. Cần nói thẳng một chi tiết: req.url ở middleware gắn tại gốc vẫn giữ chuỗi truy vấn, nên giá trị log thực tế là GET /profile?token=xyz; dù vậy phương án này đúng cấu trúc phản hồi và đúng luồng chạy, nên vẫn là lựa chọn đúng. "403 status with 'Forbidden'" chỉ xảy ra khi thiếu token. "{ user: 'Alice' }" sai vì handler có đưa trường log vào JSON. "Throws an error due to undefined `req.log`" sai vì logger chạy trước và đã gán req.log.
Mở trang câu hỏi này →
27What is the role of Handlebars partials?4 lựa chọnTrung bình67% trả lời đúng
AThey allow for reusable template pieces
BThey define conditional logic in templates
CThey manage server-side routing
DThey compile templates into JavaScript
Lời giải

Đáp án đúng: "They allow for reusable template pieces". Partial trong Handlebars là một mẩu template được đăng ký một lần bằng Handlebars.registerPartial (hoặc đặt trong thư mục partials khi dùng express-handlebars hay hbs) rồi chèn vào nhiều trang bằng cú pháp {{> header}}, rất hợp cho đầu trang, chân trang, menu dùng chung: sửa một chỗ là mọi trang đổi theo. "They define conditional logic in templates" là việc của helper khối như {{#

Lời giải
if
}
}

và {{#each}}, không phải partial. "They manage server-side routing" là việc của Express với app.get hay Router; Handlebars chỉ sinh HTML từ dữ liệu. "They compile templates into JavaScript" mô tả hàm Handlebars.compile, áp dụng cho mọi template chứ không phải vai trò riêng của partial.

Mở trang câu hỏi này →
Anode init
Bnpm init
Cnpm install
Dnode install
Lời giải
Đáp án đúng: "npm init". Lệnh npm init khởi tạo một dự án Node.js bằng cách hỏi lần lượt tên, phiên bản, mô tả, tệp entry point, lệnh test… rồi ghi ra tệp package.json, nơi lưu thông tin dự án, các script và danh sách phụ thuộc; thêm cờ -y để nhận mọi giá trị mặc định mà không phải trả lời. "node init" sai vì lệnh node dùng để chạy tệp JavaScript, chẳng hạn node app.js, nó sẽ coi init như tên một tệp cần chạy chứ không tạo dự án. "npm install" dùng để cài các gói phụ thuộc đã ghi trong package.json hoặc cài thêm một gói cụ thể; nó dựa trên dự án sẵn có chứ không phải lệnh khởi tạo dự án. "node install" không phải lệnh nào của Node.js; việc cài gói thuộc về npm chứ không thuộc về runtime node.
Mở trang câu hỏi này →
29What type of database is MongoDB?4 lựa chọn
ASQL
BNoSQL
CRelational
DHierarchical
Lời giải
Đáp án đúng: "NoSQL". MongoDB là cơ sở dữ liệu NoSQL hướng tài liệu (document-oriented): dữ liệu lưu thành tài liệu BSON (dạng nhị phân của JSON) trong collection, mỗi tài liệu có thể có cấu trúc khác nhau, không cần lược đồ bảng cố định, và truy vấn bằng đối tượng lọc với toán tử như $gt, $in thay vì câu lệnh SQL. "SQL" sai vì MongoDB không dùng ngôn ngữ SQL và không tổ chức dữ liệu thành bảng, hàng, cột. "Relational" sai vì cơ sở dữ liệu quan hệ như MySQL, PostgreSQL ràng buộc bảng bằng khoá ngoại và phép JOIN, còn MongoDB liên kết bằng tài liệu nhúng hoặc ObjectId tham chiếu. "Hierarchical" chỉ mô hình phân cấp kiểu cây cổ điển, mỗi bản ghi có đúng một cha; tài liệu MongoDB có thể lồng nhau nhưng mô hình tổng thể không phải cây cha – con cứng nhắc đó.
Mở trang câu hỏi này →
30Consider the following code snippet using async/await:4 lựa chọncó codeDễ75% trả lời đúng
Đề bài
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
Đáp án đúng gồm hai ý: "It makes the code easier to read and understand." và "It simplifies error handling with try/catch blocks.". async/await là cú pháp viết trên nền Promise: await tạm dừng hàm async cho tới khi Promise của fetch rồi của response.json() hoàn tất, nên mã đọc tuần tự từ trên xuống như mã đồng bộ thay vì chuỗi .then() lồng nhau; Promise bị từ chối sẽ ném lỗi ngay tại chỗ await và được khối try/catch bắt như ngoại lệ thường. "It ensures the code runs synchronously." sai vì hàm vẫn bất đồng bộ: fetchData() trả về Promise ngay, event loop không bị chặn, chỉ phần thân hàm sau await bị hoãn. "It eliminates the need for callbacks entirely." quá tuyệt đối: await dựa trên Promise mà Promise vẫn đăng ký hàm xử lý bên dưới, và nhiều API kiểu sự kiện hay setTimeout vẫn cần callback; async/await chỉ giảm callback lồng nhau trong mã ta viết.
Mở trang câu hỏi này →
AImport the MongoClient class from the mongodb module with the require() statement.
BCreate an instance of the MongoDatabase class.
CCall the connect() method on the MongoClient instance by passing the MongoDB server URL.
DUse the import statement to import MongoClient.
Lời giải

Đáp án đúng gồm hai ý: "Import the MongoClient class from the mongodb module with the require() statement." và "Call the connect() method on the MongoClient instance by passing the MongoDB server URL.". Với driver mongodb chính thức theo kiểu CommonJS, đầu tiên lấy lớp bằng const { MongoClient } = require('mongodb'), sau đó tạo client và gọi connect() với chuỗi kết nối như mongodb://localhost:27017 (bản driver mới thường truyền URL vào new MongoClient(url) rồi gọi client.connect(), bản cũ dùng MongoClient.connect(url)); kết nối xong mới gọi client.db() để chọn database. "Create an instance of the MongoDatabase class." sai vì driver không có lớp MongoDatabase; đối tượng database có kiểu Db và lấy qua client.db(), không tự tạo bằng new. "Use the import statement to import MongoClient." chỉ đúng khi dự án dùng ES module, còn quy trình được hỏi dựa trên require() của CommonJS nên đây không phải bước bắt buộc.

Mở trang câu hỏi này →
Amongoose.createSchema()
Bmongoose.newSchema()
Cmongoose.Schema
Dmongoose.model
Lời giải
Đáp án đúng: "mongoose.Schema". Schema là một lớp (constructor) mà Mongoose cung cấp, nên định nghĩa schema bằng cách khởi tạo nó: new mongoose.Schema với đối tượng mô tả các trường như name kiểu String, age kiểu Number cùng các ràng buộc. Schema chỉ mô tả cấu trúc và quy tắc; sau đó mới dùng nó để tạo model. "mongoose.createSchema()" không tồn tại trong API của Mongoose. "mongoose.newSchema()" cũng không tồn tại; từ new phải là toán tử new của JavaScript đứng trước mongoose.Schema chứ không gộp vào tên hàm. "mongoose.model" là hàm dùng ở bước sau, nhận tên và một schema đã có để biên dịch thành Model gắn với collection, nên nó tạo model chứ không định nghĩa schema.
Mở trang câu hỏi này →
Đề bài
const express = require('express');
const mongoose = require('mongoose');
const app = express();

mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });

Đề bài
const userSchema = new mongoose.Schema({ name: String });
const User = mongoose.model('User', userSchema);
app.get('/api/users/search', async (req, res) => {
  const { name } = req.query;
  const users = await User.find({ name: new RegExp(name, 'i') });
  res.json(users);
});
app.listen(3000);

Assume the database has users: { name: "Alice" }, { name: "Bob" }, { name: "Alan" }.

A[{ name: "Alice" }, { name: "Alan" }]
B[{ name: "Alice" }, { name: "Bob" }, { name: "Alan" }]
C[]
DThrows an error due to invalid regex
Lời giải
Đáp án đúng: "[{ name: "Alice" }, { name: "Alan" }]". Lần theo mã: request GET tới /api/users/search?name=al làm req.query có name bằng al; route tạo new RegExp(name, 'i'), tức biểu thức chính quy al với cờ i không phân biệt hoa thường, rồi User.find lọc các tài liệu có name chứa chuỗi al ở bất kỳ vị trí nào. Alice bắt đầu bằng Al nên khớp, Alan cũng bắt đầu bằng Al nên khớp, Bob không chứa al nên bị loại; res.json trả mảng hai tài liệu (thực tế mỗi tài liệu còn kèm _id và __v, ở đây được lược đi). "[{ name: "Alice" }, { name: "Bob" }, { name: "Alan" }]" sai vì Bob không khớp mẫu. "[]" chỉ xảy ra nếu bỏ cờ i, khi đó al thường không khớp Al hoa; ở đây cờ i có mặt. "Throws an error due to invalid regex" sai vì al là mẫu hợp lệ, RegExp chỉ ném lỗi khi chuỗi có cú pháp hỏng như dấu ngoặc mở mà không đóng.
Mở trang câu hỏi này →
A{ type: mongoose.Schema.Types.Mixed, ref: 'User' }
B{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }
C{ type: mongoose.Schema.Types.ObjectId, 'User' }
D{ type: mongoose.Schema.Types.ObjectId, reference: 'User' }
Lời giải
Đáp án đúng: "{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }". Tham chiếu chuẩn trong Mongoose lưu _id của tài liệu khác với kiểu ObjectId và dùng khoá ref để chỉ tên model; populate() đọc đúng khoá ref này để biết lấy dữ liệu từ đâu. "{ type: mongoose.Schema.Types.Mixed, ref: 'User' }" sai vì Mixed là kiểu tuỳ ý, không ép giá trị về dạng id; tài liệu Mongoose chỉ nêu ObjectId, Number, String và Buffer là các kiểu dùng làm ref. "{ type: mongoose.Schema.Types.ObjectId, 'User' }" sai cú pháp JavaScript vì trong object literal giá trị 'User' đứng một mình không có tên khoá. "{ type: mongoose.Schema.Types.ObjectId, reference: 'User' }" chạy được nhưng reference không phải tuỳ chọn mà Mongoose hiểu, nên trường chỉ là ObjectId trơn và populate không biết trỏ về model nào.
Mở trang câu hỏi này →
35What is the main purpose of HTTPS?4 lựa chọnDễ
ASpeed up web requests
BSecure communication over a network
CManage HTTP methods
DProvide dynamic routing
Lời giải
Đáp án đúng: "Secure communication over a network". HTTPS là HTTP chạy trên TLS: máy khách xác thực máy chủ bằng chứng chỉ số, hai bên thoả thuận khoá phiên rồi mã hoá toàn bộ request và response, nhờ đó dữ liệu như mật khẩu, cookie, token JWT không bị nghe lén hay sửa giữa đường; trong Node.js có thể dựng bằng module https với khoá và chứng chỉ. "Speed up web requests" sai vì mục tiêu của HTTPS là bảo mật; bắt tay TLS còn thêm một chút độ trễ. "Manage HTTP methods" sai vì GET, POST, PUT, DELETE giữ nguyên ý nghĩa, HTTPS không đổi gì ở tầng phương thức. "Provide dynamic routing" là việc của framework như Express, không phải của giao thức truyền tải.
Mở trang câu hỏi này →
36In Mongoose, which method is used to create a new document?4 lựa chọnTrung bình67% trả lời đúng
AModel.find()
BModel.insert()
CModel.save()
Dnew Model().save()
Lời giải
Đáp án đúng: "new Model().save()". Trong Mongoose, mỗi document là một thể hiện (instance) của model: viết new User với dữ liệu sẽ tạo document trong bộ nhớ, đã được gán _id và kiểm theo schema, rồi gọi save() trên chính document đó để chạy validation, middleware pre save và ghi vào MongoDB; save trả về Promise nên thường dùng await. Mongoose cũng có Model.create() làm hai bước này gọn trong một lần gọi, nhưng nó không có trong danh sách. "Model.find()" là truy vấn đọc, trả về các document đã có chứ không tạo mới. "Model.insert()" không phải phương thức của model Mongoose; thứ có thật là insertMany() để chèn hàng loạt. "Model.save()" sai vì save là phương thức của từng document chứ không phải phương thức tĩnh của lớp model, gọi trên Model sẽ không tồn tại.
Mở trang câu hỏi này →
Anpm is a package manager for JavaScript
Bnpm can be used to install, share, and distribute code
Cnpm is only used for managing dependencies in Node.js
Dnpm cannot be used for managing scripts
Lời giải
Đáp án đúng gồm hai ý: "npm is a package manager for JavaScript" và "npm can be used to install, share, and distribute code". npm là trình quản lý gói (package manager) đi kèm Node.js, gồm công cụ dòng lệnh và kho npm registry: npm install tải gói theo package.json, npm publish đưa gói của mình lên kho để người khác cài và dùng lại. "npm is only used for managing dependencies in Node.js" sai ở chữ only: npm còn quản lý gói cho mã chạy ở trình duyệt (React, Vue được cài bằng npm rồi đóng gói bằng bundler), chạy script, kiểm tra lỗ hổng bằng npm audit. "npm cannot be used for managing scripts" sai vì mục scripts trong package.json cho phép định nghĩa lệnh như start, test, build và chạy chúng bằng npm run build hoặc npm test.
Mở trang câu hỏi này →
Abody-parser
Bmulter
Cexpress-upload
Dfs-upload
Lời giải
Đáp án đúng: "multer". multer là middleware Express chuyên xử lý body dạng multipart/form-data, kiểu mã hoá mà form và client dùng khi gửi tệp; nó tách các phần tệp, lưu ra đĩa hoặc bộ nhớ, rồi gắn thông tin vào req.file hoặc req.files, ví dụ qua upload.single('avatar'). "body-parser" chỉ phân tích JSON, urlencoded, text và raw, chính tài liệu của nó nói không xử lý multipart. "express-upload" không phải gói chuẩn được dùng rộng rãi; gói gần tên là express-fileupload có tồn tại nhưng ít phổ biến hơn multer. "fs-upload" không phải thư viện tải tệp phổ biến nào cho Express; module fs chỉ thao tác tệp trên đĩa, không đọc được body multipart của request.
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
Đáp án đúng gồm hai ý: "An SDK is more appropriate for interacting with the device's camera and GPS." và "An API is more appropriate for fetching weather data from an external service.". SDK (bộ công cụ phát triển phần mềm) như Android SDK hay iOS SDK gói sẵn thư viện, cơ chế xin quyền và công cụ để chạm vào phần cứng của thiết bị, nên việc mở camera hay đọc GPS nằm ngay trong máy và cần SDK của nền tảng; còn dữ liệu thời tiết nằm trên máy chủ bên ngoài, ứng dụng chỉ cần gửi HTTP request tới API (giao diện lập trình) của dịch vụ đó và nhận JSON trả về. "An API is more appropriate for interacting with the device's" sai vì chỉ gọi API từ xa thì không truy cập được phần cứng cục bộ; SDK cũng phơi ra API nội bộ, nhưng thứ lập trình viên cần cài và dùng ở đây là SDK. "An SDK is more appropriate for fetching weather data" sai vì không cần cả bộ công cụ chỉ để gọi một dịch vụ web, dù có nhà cung cấp phát hành SDK bọc quanh API của họ cho tiện.
Mở trang câu hỏi này →
40How to install Express?4 lựa chọnDễ
Anode install express --save
Bnpm uninstall express -save
Cnpm install express -save
Dnpm express install
Lời giải
Đáp án đúng: "npm install express -save". Express là gói trên kho npm nên được cài bằng trình quản lý gói npm: lệnh npm install express tải gói vào thư mục node_modules của dự án, còn cờ save ở đuôi (thường viết đầy đủ là --save) yêu cầu ghi express vào mục dependencies của package.json; từ npm 5 việc ghi này đã là mặc định nên chỉ npm install express cũng đủ. "node install express --save" sai vì node là runtime để chạy tệp JavaScript, không có lệnh install cài gói. "npm uninstall express -save" làm ngược lại: gỡ express khỏi node_modules và xoá nó khỏi dependencies. "npm express install" sai thứ tự: npm luôn nhận lệnh con đứng ngay sau nó, ở đây express không phải lệnh con nào của npm nên lệnh không chạy như mong muốn.
Mở trang câu hỏi này →