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ố 2

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 đề.

Danh sách câu hỏi

20/50 câuCòn 30
Đề bài
import { Controller, Get } from '@nestjs/common';
@Controller('cats')
export class CatsController {
    @Get()
    findAll() {
        return ['cat1', 'cat2'];
    }
}
A['cat1', 'cat2']
BArray of resources if route matched
CStandard response from controller method
DEmpty
Lời giải
Đáp án đúng: "['cat1', 'cat2']". Decorator @Controller('cats') gắn tiền tố đường dẫn /cats cho cả class, còn @Get() không đối số ánh xạ phương thức findAll vào GET /cats; khi handler trả về một mảng hay object, NestJS tự tuần tự hoá (serialize) nó thành JSON và gửi với mã 200, nên client nhận đúng mảng gồm cat1 và cat2. "Array of resources if route matched" chỉ là mô tả chung chung có điều kiện, không phải giá trị cụ thể mà đoạn mã trả về. "Standard response from controller method" cũng là câu mơ hồ, không nêu nội dung phản hồi. "Empty" sai vì findAll có lệnh return một mảng hai phần tử, phản hồi không hề rỗng; nó chỉ rỗng khi handler không trả về gì.
Mở trang câu hỏi này →
ASOAP API
BREST API
CXML API
DJSON API
Lời giải
Đáp án đúng: "REST API". YouTube Data API được thiết kế theo kiểu REST (Representational State Transfer, chuyển trạng thái biểu diễn): mỗi tài nguyên như video, playlist hay channel có một URL riêng, ứng dụng thao tác với nó bằng các phương thức HTTP chuẩn như GET, POST, PUT, DELETE và nhận dữ liệu trả về dạng JSON. Vì dịch vụ đã cung cấp REST API, phía Node.js chỉ cần gửi request HTTP (bằng fetch, axios hoặc thư viện googleapis) theo đúng kiểu đó. "SOAP API" là giao thức dựa trên thông điệp XML bọc trong envelope và mô tả bằng WSDL, YouTube không mở giao diện này nên chọn nó là không khớp với dịch vụ cần tích hợp. "XML API" chỉ gọi tên một định dạng dữ liệu chứ không phải một kiểu kiến trúc API, và YouTube cũng không dùng XML làm định dạng chính. "JSON API" cũng là tên định dạng (hoặc một đặc tả riêng tên JSON:API); REST API của YouTube có trả JSON, nhưng kiểu API phải chọn để tích hợp vẫn là REST.
Mở trang câu hỏi này →
AUsing random status codes for different endpoints
BReturning HTML responses for all API calls
CAdhering to HTTP status codes and consistent response formats
DRequiring clients to parse server logs for errors
Lời giải
Đáp án đúng: "Adhering to HTTP status codes and consistent response formats". REST API dùng chính giao thức HTTP làm hợp đồng với client: mã trạng thái (status code) như 200 OK, 201 Created, 400 Bad Request, 404 Not Found, 500 Internal Server Error cho client biết kết quả mà chưa cần đọc nội dung, còn định dạng phản hồi nhất quán (thường là JSON cùng một cấu trúc cho dữ liệu và cho lỗi) giúp client viết một bộ xử lý dùng chung cho mọi endpoint. "Using random status codes for different endpoints" phá vỡ ý nghĩa chuẩn của mã trạng thái, client không còn dựa vào mã để biết thành công hay thất bại. "Returning HTML responses for all API calls" không hợp với API vốn phục vụ chương trình đọc; HTML dành cho trình duyệt hiển thị, client phải bóc tách giao diện mới lấy được dữ liệu. "Requiring clients to parse server logs for errors" sai vì log là công cụ nội bộ của phía máy chủ, client không có quyền truy cập, và lỗi phải được trả về ngay trong phản hồi HTTP.
Mở trang câu hỏi này →
4What is an API Gateway?4 lựa chọnDễ
AA tool that manages and routes API requests.
BA database management system.
CA web server that hosts static files.
DA software development framework.
Lời giải
Đáp án đúng: "A tool that manages and routes API requests.". API Gateway (cổng API) là một lớp đứng trước các dịch vụ phía sau, nhận mọi yêu cầu từ client rồi định tuyến (routing) tới đúng dịch vụ, đồng thời thường đảm nhận các việc chung như xác thực, giới hạn tần suất (rate limiting), ghi log, chuyển đổi giao thức và gom phản hồi; mô hình này rất phổ biến trong kiến trúc microservices. "A database management system." sai vì hệ quản trị cơ sở dữ liệu như MongoDB lưu và truy vấn dữ liệu chứ không điều phối lưu lượng API. "A web server that hosts static files." sai vì máy chủ tệp tĩnh chỉ trả HTML, CSS, ảnh, còn gateway chuyển tiếp yêu cầu tới dịch vụ khác. "A software development framework." sai vì framework như Express hay NestJS dùng để viết ứng dụng, còn gateway là thành phần hạ tầng đứng giữa client và các API đã viết xong.
Mở trang câu hỏi này →
AImports modules
BWrites files
CHandles HTTP requests
DExecutes JavaScript code
Lời giải
Đáp án đúng: "Imports modules". Trong hệ module CommonJS mà Node.js dùng mặc định cho tệp .js, require() nạp một module (module lõi như fs, gói trong node_modules hoặc tệp cục bộ theo đường dẫn), chạy mã của nó một lần, lưu vào bộ đệm và trả về giá trị module.exports để nơi gọi sử dụng. "Writes files" là việc của module fs, chẳng hạn fs.writeFile; require() chỉ giúp lấy module fs về chứ không tự ghi tệp. "Handles HTTP requests" là việc của module http hoặc framework như Express. "Executes JavaScript code" chỉ đúng một phần vì khi nạp lần đầu mã của module có được chạy, nhưng đó là hệ quả phụ; mục đích của require() là nhập module và trả về phần được export, không phải một hàm chạy mã tuỳ ý như eval.
Mở trang câu hỏi này →
Đề bài
const { MongoClient } = require('mongodb');
async function main() {
    const client = await MongoClient.connect('mongodb://localhost:27017');
    const db = client.db('db');
    await db.collection('coll').insertOne({ key: 'value' });
    const doc = await db.collection('coll').findOne({ key: 'value' });
    console.log(doc.key);
    client.close();
}
main();
Avalue
BThe inserted document's key if found
CConnection details if database accessed
DDocument object with full properties
Lời giải
Đáp án đúng: "value". Lần theo mã: MongoClient.connect mở kết nối tới máy chủ localhost cổng 27017 và trả về client, client.db('db') chọn cơ sở dữ liệu tên db, insertOne thêm vào collection coll một document có trường key mang chuỗi value, rồi findOne với bộ lọc key bằng value trả về đúng document vừa chèn, gồm _id và key. Dòng console.log(doc.key) chỉ in giá trị của trường key nên màn hình hiện chữ value, sau đó client.close() đóng kết nối. "The inserted document's key if found" mô tả bằng một điều kiện mơ hồ, trong khi document chắc chắn tồn tại vì đã được await insertOne trước đó, và thứ in ra là một chuỗi cụ thể chứ không phải lời mô tả chung. "Connection details if database accessed" sai vì mã không hề in thông tin kết nối, nó chỉ in một trường của document. "Document object with full properties" chỉ đúng nếu viết console.log(doc), khi đó sẽ thấy cả _id lẫn key; ở đây mã truy cập doc.key nên kết quả chỉ là chuỗi value.
Mở trang câu hỏi này →
7Which statements correctly describe CRUD operations in MongoDB?4 lựa chọnTrung bình50% 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
Đáp án đúng gồm hai ý: "find is used to retrieve documents from a collection." và "deleteMany is used to delete multiple documents from a collection.". CRUD là bốn thao tác Create, Read, Update, Delete (tạo, đọc, sửa, xoá); trong MongoDB chúng ứng với nhóm insertOne/insertMany, find/findOne, updateOne/updateMany và deleteOne/deleteMany, tên hàm nói đúng thao tác và số lượng tài liệu bị tác động. find trả về con trỏ (cursor) gồm các tài liệu khớp bộ lọc, còn deleteMany xoá mọi tài liệu khớp bộ lọc. "updateOne is used to delete a single document from a collection." sai vì updateOne sửa tài liệu đầu tiên khớp bộ lọc bằng toán tử như $set, không xoá gì; muốn xoá một tài liệu phải dùng deleteOne. "insertMany is used to update multiple documents in a collection." sai vì insertMany thêm một mảng tài liệu mới vào collection; sửa nhiều tài liệu cùng lúc là việc của updateMany.
Mở trang câu hỏi này →
A404 Not Found
B400 Bad Request
C403 Forbidden
D1
Lời giải
Đáp án đúng: "404 Not Found". Theo chuẩn HTTP, nhóm mã 4xx báo lỗi phía client và mã 404 nghĩa là máy chủ không tìm thấy tài nguyên ứng với URI được yêu cầu, ví dụ GET /users/123 khi không có người dùng mang id đó; trong Express thường viết res.status(404).json(...) để báo điều này. "400 Bad Request" dành cho yêu cầu sai cú pháp hoặc dữ liệu không hợp lệ, như body thiếu trường bắt buộc, chứ không phải tài nguyên vắng mặt. "403 Forbidden" nghĩa là máy chủ hiểu yêu cầu nhưng từ chối vì người gọi không có quyền, tài nguyên có thể vẫn tồn tại. "1" không phải mã trạng thái HTTP nào cả, vì mã trạng thái luôn là số có ba chữ số trong khoảng từ 100 đến 599.
Mở trang câu hỏi này →
AA server can support multiple databases.
BA database consists of a set of collections.
CA collection is a set of tables.
DA document is effectively a JSON document with some additional features.
Lời giải
Đáp án đúng gồm ba ý: "A server can support multiple databases.", "A database consists of a set of collections." và "A document is effectively a JSON document with some additional features.". MongoDB tổ chức dữ liệu theo tầng: một máy chủ (server, tiến trình mongod) chứa nhiều database, mỗi database gồm nhiều collection (tập hợp), mỗi collection gồm nhiều document; document được lưu dưới dạng BSON, tức JSON nhị phân có thêm kiểu dữ liệu như Date, ObjectId, số nguyên 64 bit, nên gọi là JSON có thêm tính năng. "A collection is a set of tables." sai vì MongoDB không có khái niệm bảng; chính collection mới là thứ tương đương một bảng trong SQL, và nó chứa các document chứ không chứa bảng nào.
Mở trang câu hỏi này →
AInserts a document into the collection
BUpdates a document in the collection
CDeletes a document from the collection
DRetrieves documents from the collection
Lời giải
Đáp án đúng: "Retrieves documents from the collection". db.collection.find() là thao tác đọc, tức chữ R (Read) trong CRUD: nó nhận một bộ lọc (query filter) và tuỳ chọn projection để chọn trường, rồi trả về một cursor (con trỏ) duyệt qua các document khớp điều kiện; gọi find() không kèm bộ lọc sẽ lấy toàn bộ collection. Lệnh này không làm thay đổi dữ liệu nào. "Inserts a document into the collection" là việc của insertOne() hoặc insertMany(). "Updates a document in the collection" là việc của updateOne(), updateMany() hay replaceOne(), những lệnh nhận bộ lọc cùng toán tử cập nhật như $set. "Deletes a document from the collection" là việc của deleteOne() hoặc deleteMany(). Tên find nói đúng bản chất của nó: tìm và trả về, không thêm, sửa hay xoá document.
Mở trang câu hỏi này →
ATo fetch referenced documents
BTo delete documents
CTo update schema
DTo create new collections
Lời giải
Đáp án đúng: "To fetch referenced documents". Trong Mongoose, một trường có thể lưu ObjectId kèm khai báo ref trỏ tới model khác; populate() đọc các ObjectId đó, chạy thêm truy vấn vào collection được tham chiếu rồi thay ObjectId bằng tài liệu thật trong kết quả, gần giống phép nối (join) ở cơ sở dữ liệu quan hệ. "To delete documents" sai vì xoá là việc của deleteOne, deleteMany hay findByIdAndDelete, còn populate() chỉ đọc. "To update schema" sai vì schema được định nghĩa bằng new Schema() và chỉ đổi khi sửa mã nguồn, populate() không chạm tới cấu trúc dữ liệu. "To create new collections" sai vì collection được tạo khi model ghi tài liệu đầu tiên hoặc khi gọi createCollection(); populate() chỉ truy vấn những collection đã có.
Mở trang câu hỏi này →
Apopulate()
Bfind()
Clookup()
Daggregate()
Lời giải
Đáp án đúng: "populate()". Trong Mongoose, khi một trường lưu ObjectId kèm ref tới model khác, gọi populate() trên query, ví dụ Post.find().populate('author'), khiến Mongoose chạy thêm truy vấn tới collection được tham chiếu rồi thay ObjectId bằng tài liệu đầy đủ trong kết quả. "find()" chỉ lấy tài liệu của chính collection đang truy vấn, trường tham chiếu vẫn giữ nguyên ObjectId nếu không nối thêm populate(). "lookup()" chỉ có trên đối tượng Aggregate của Mongoose, dùng để thêm giai đoạn $lookup vào aggregation pipeline với các trường nối do lập trình viên tự khai báo, không đọc ref của schema nên không phải method điền tài liệu được tham chiếu. "aggregate()" có thể dùng $lookup để nối dữ liệu ngay phía máy chủ cơ sở dữ liệu, nhưng đó là cơ chế pipeline riêng phải tự viết từng giai đoạn, không phải method điền tài liệu tham chiếu dựa trên ref mà câu hỏi nhắc tới.
Mở trang câu hỏi này →
AExpress automatically compiles JavaScript into machine code for faster execution
BExpress provides a routing system and middleware pipeline to streamline request processing
CExpress eliminates the need for external modules like `http` or `url`
DExpress includes a built-in database driver for MongoDB
Lời giải
Đáp án đúng: "Express provides a routing system and middleware pipeline to streamline request processing". Với module http thuần, lập trình viên phải tự đọc req.url và req.method, tự viết chuỗi if để định tuyến, tự phân tích query và body; Express gói những việc đó thành hệ định tuyến (app.get, app.post, express.Router, tham số đường dẫn như /users/:id) và chuỗi middleware chạy lần lượt qua next(), nhờ đó các bước như phân tích JSON, xác thực, ghi log được tách thành hàm tái sử dụng. "Express automatically compiles JavaScript into machine code" sai vì biên dịch JIT là việc của engine V8 trong Node.js, Express không can thiệp. "Express eliminates the need for external modules" sai vì Express vẫn được dựng trên module http của Node.js, chỉ che bớt chi tiết chứ không loại bỏ nó. "Express includes a built-in database driver for MongoDB" sai vì Express không kèm driver cơ sở dữ liệu nào; muốn dùng MongoDB phải cài thêm gói mongodb hoặc Mongoose.
Mở trang câu hỏi này →
Đề bài
const express = require('express');
const app = express();

app.use((req, res, next) => {
  console.log(`${req.method} request for '${req.url}'`);
  next();
});

app.get('/', (req, res) => {
  res.send('Welcome to the homepage!');
});

app.get('/about', (req, res) => {
  res.send('About us');
});

app.use((req, res) => {
  res.status(404).send('Page not found');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});
AIt logs all incoming requests to the console.
BIt returns 'Welcome to the homepage!' for GET requests to the root URL.
CIt returns a 404 error for any undefined routes.
DIt only handles POST requests.
Lời giải
Đáp án đúng gồm ba ý: "It logs all incoming requests to the console.", "It returns 'Welcome to the homepage!' for GET requests to the root URL." và "It returns a 404 error for any undefined routes.". Lần theo mã: middleware đầu tiên khai báo bằng app.use không kèm đường dẫn nên chạy cho mọi request, in ra phương thức và URL (ví dụ GET request for '/about') rồi gọi next() để chuyển request xuống các route phía sau. Route app.get('/') gửi chuỗi Welcome to the homepage!, route app.get('/about') gửi About us. Middleware cuối cùng đặt sau mọi route, chỉ được chạy khi không route nào trả lời trước đó, nên nó đặt mã trạng thái 404 và gửi Page not found cho mọi đường dẫn chưa định nghĩa; app.listen mở máy chủ ở cổng 3000. Trình duyệt khi gõ địa chỉ sẽ gửi GET, nên cả ba hành vi trên đều quan sát được. "It only handles POST requests." sai vì mã chỉ đăng ký app.get, không có app.post nào; một request POST tới gốc vẫn được middleware đầu ghi log nhưng rồi rơi xuống middleware 404 vì không có route POST khớp.
Mở trang câu hỏi này →
AExpress
BSpring
CHibernate
D.Net
Lời giải

Đáp án đúng: "Express". Câu này chép gần nguyên văn khẩu hiệu trên trang chủ Express: Fast, unopinionated, minimalist web framework for Node.js; unopinionated (không áp đặt) nghĩa là Express không bắt buộc cấu trúc thư mục hay thư viện truy cập dữ liệu nào, chỉ cung cấp định tuyến (routing) và chuỗi middleware tối giản để lập trình viên tự ghép. "Spring" là framework của hệ Java, chạy trên JVM chứ không trên Node.js, và nổi tiếng với nhiều quy ước sẵn. "Hibernate" là thư viện ORM (ánh xạ đối tượng – quan hệ) cho Java, không phải web framework. ".Net" là nền tảng của Microsoft cho C# và các ngôn ngữ CLR; web framework của nó là ASP.NET, không liên quan tới Node.js.

Mở trang câu hỏi này →
Ares.text()
Bres.html()
Cres.json()
Dres.response()
Lời giải
Đáp án đúng: "res.json()". Trong Express, res.json() chuyển đối tượng hoặc mảng JavaScript thành chuỗi JSON bằng JSON.stringify, đặt header Content-Type là application/json rồi gửi phản hồi và kết thúc request, ví dụ res.status(200).json(user). "res.text()" không tồn tại trên đối tượng response của Express; muốn gửi văn bản thường thì dùng res.send() với một chuỗi. "res.html()" cũng không phải API của Express; HTML được gửi bằng res.send() với chuỗi HTML, res.sendFile() hoặc res.render() khi dùng template engine. "res.response()" không có trong Express, có lẽ là nhầm với chính đối tượng response; mọi thao tác gửi phản hồi đều đi qua các method như send, json, sendFile hay end.
Mở trang câu hỏi này →
17Which is the correct order of middleware execution in Express.js?4 lựa chọnTrung bình67% trả lời đúng
ADefined order in code
BAlphabetical order
CBased on request type
DRandom order
Lời giải
Đáp án đúng: "Defined order in code". Express lưu các middleware và route vào một ngăn xếp (stack) theo đúng thứ tự các lệnh app.use và app.get được viết trong mã, rồi với mỗi request nó duyệt ngăn xếp từ trên xuống, chạy hàm nào khớp đường dẫn và phương thức, và chỉ chuyển sang hàm kế khi hàm hiện tại gọi next(), nên đặt express.json() sau route cần đọc req.body thì route đó sẽ không có body. "Alphabetical order" sai vì tên hàm hay tên đường dẫn không ảnh hưởng thứ tự chạy. "Based on request type" sai vì phương thức HTTP chỉ quyết định một middleware có khớp hay không, còn trong các hàm đã khớp thì thứ tự vẫn là thứ tự khai báo. "Random order" sai vì thứ tự hoàn toàn xác định, chạy lại bao nhiêu lần cũng như nhau.
Mở trang câu hỏi này →
Alist collections
Bshow collections
Cdb.collections()
Dcollections show
Lời giải
Đáp án đúng: "show collections". Trong MongoDB shell (mongosh hay mongo cũ), show là một lệnh trợ giúp (shell helper) theo sau là thứ cần liệt kê: show dbs liệt kê cơ sở dữ liệu, show collections liệt kê các collection của cơ sở dữ liệu đang chọn bằng use, show users liệt kê người dùng. "list collections" không phải lệnh shell; tên gần nhất là lệnh cơ sở dữ liệu listCollections, phải gọi qua db.runCommand, hoặc dùng hàm db.getCollectionNames(). "db.collections()" không phải hàm của shell; trong Node.js driver có phương thức collections() trên đối tượng Db trả về mảng đối tượng Collection trong mã ứng dụng, nhưng câu hỏi hỏi lệnh hiển thị trong shell. "collections show" đảo ngược thứ tự: cú pháp của shell helper là show đứng trước, đối tượng cần liệt kê đứng sau, nên shell sẽ báo lỗi vì không hiểu collections là lệnh gì.
Mở trang câu hỏi này →
19What does CORS stand for?4 lựa chọn
ACross-Origin Resource Sharing
BClient-Origin Resource Service
CCustom-Origin Request Script
DCross-Origin Request Sharing
Lời giải
Đáp án đúng: "Cross-Origin Resource Sharing". CORS là cơ chế chia sẻ tài nguyên khác nguồn gốc: trình duyệt mặc định áp chính sách cùng nguồn gốc (same-origin policy), và máy chủ dùng các header như Access-Control-Allow-Origin để cho phép một origin khác (khác giao thức, tên miền hoặc cổng) đọc phản hồi; ở Express thường bật bằng gói cors. "Client-Origin Resource Service" sai vì chữ C là Cross (vượt qua, khác nguồn) chứ không phải Client, và chữ S cuối là Sharing chứ không phải Service. "Custom-Origin Request Script" sai cả ba thành phần, CORS không phải một đoạn script. "Cross-Origin Request Sharing" gần đúng nhất nhưng sai chữ R: thứ được chia sẻ là Resource (tài nguyên) như dữ liệu JSON hay hình ảnh, không phải Request.
Mở trang câu hỏi này →
AAccess-Control-Allow-Methods
BAccess-Control-Allow-Origin
CContent-Type
DCache-Control
Lời giải
Đáp án đúng gồm hai ý: "Access-Control-Allow-Methods" và "Access-Control-Allow-Origin". CORS (Cross-Origin Resource Sharing, chia sẻ tài nguyên khác nguồn) là cơ chế trình duyệt dùng để quyết định trang ở origin này có được đọc phản hồi từ API ở origin khác hay không, và quyết định đó dựa vào các header Access-Control mà máy chủ trả về: một header cho biết origin nào được phép, header kia liệt kê các method như GET, POST, DELETE được chấp nhận, thường trả trong phản hồi preflight OPTIONS; middleware cors của Express đặt các header này tự động. "Content-Type" chỉ mô tả định dạng của body như application/json, không liên quan việc cho phép truy cập khác nguồn. "Cache-Control" điều khiển việc lưu đệm phản hồi ở trình duyệt hoặc proxy, cũng không bật được CORS.
Mở trang câu hỏi này →