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 3/3 — câu 41–50.

Danh sách câu hỏi

50/50 câuHết danh sách
AEncrypt database queries
BStore server logs
CTrack client-side session information
DMinify JavaScript code
Lời giải
Đáp án đúng: "Track client-side session information". Cookie là mẩu dữ liệu nhỏ máy chủ gửi qua header Set-Cookie, trình duyệt lưu lại và tự gửi kèm trong header Cookie ở mỗi request tới cùng tên miền; nhờ đó HTTP vốn không trạng thái (stateless) vẫn nhận ra người dùng, ví dụ express-session đặt cookie connect.sid chứa mã phiên, hoặc cookie lưu tuỳ chọn ngôn ngữ, giỏ hàng. "Encrypt database queries" sai vì cookie không tham gia vào truy vấn cơ sở dữ liệu, và mã hoá đường truyền là việc của TLS. "Store server logs" sai vì log được ghi ở phía máy chủ bằng công cụ như morgan hay winston, còn cookie chỉ chứa vài KB và nằm ở trình duyệt. "Minify JavaScript code" là việc của công cụ build như Terser, esbuild, không liên quan tới cookie.
Mở trang câu hỏi này →
AMongoose adds structure to MongoDB documents through schemas.
BMongoose is an Object Relational Mapping (ORM) tool.
CMongoose provides an Object Document Mapping (ODM) system.
DMongoose enforces a strict schema on all documents stored in MongoDB.
Lời giải
Đáp án đúng gồm hai ý: "Mongoose adds structure to MongoDB documents through schemas." và "Mongoose provides an Object Document Mapping (ODM) system.". MongoDB tự nó không bắt buộc cấu trúc cho tài liệu; Mongoose thêm lớp schema mô tả trường, kiểu, giá trị mặc định, validator, rồi ánh xạ mỗi tài liệu thành đối tượng JavaScript có method, đó chính là ODM, ánh xạ giữa đối tượng và tài liệu. "Mongoose is an Object Relational Mapping (ORM) tool." sai vì ORM dành cho cơ sở dữ liệu quan hệ có bảng và khoá ngoại, như Sequelize với PostgreSQL, còn MongoDB lưu tài liệu. "Mongoose enforces a strict schema on all documents stored in MongoDB." sai vì schema chỉ có hiệu lực với dữ liệu đi qua model Mongoose; ứng dụng khác hay mongosh vẫn ghi tài liệu tuỳ ý vào cùng collection, và chế độ strict cũng chỉ bỏ các trường lạ khi lưu qua Mongoose.
Mở trang câu hỏi này →
ANone
BGet, Get
CPost, Post
DGet, Post
Lời giải
Đáp án đúng: "Get, Get". Theo ngữ nghĩa HTTP, GET là phương thức dùng để lấy biểu diễn của tài nguyên tại URL đã cho, và là phương thức an toàn (safe): request GET chỉ được đọc dữ liệu, không làm thay đổi trạng thái máy chủ, nên cả hai chỗ trống đều điền GET; nhờ vậy trình duyệt, proxy có thể lưu đệm và gửi lại GET mà không sợ tác dụng phụ. "Get, Post" sai ở chỗ trống thứ hai vì POST dùng để gửi dữ liệu cho máy chủ xử lý, thường tạo tài nguyên mới, tức là có thay đổi trạng thái. "Post, Post" sai cả hai chỗ vì POST không phải phương thức để truy xuất thông tin. "None" sai vì có một cách điền đúng là GET cho cả hai chỗ trống.
Mở trang câu hỏi này →
44Which 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
Đáp án đúng: "http". Module http có sẵn của Node.js cung cấp http.createServer, nhận một hàm xử lý với hai đối số req và res, trả về đối tượng server; gọi server.listen với số cổng thì máy chủ web bắt đầu nhận request. Express hay các framework khác cũng dựng trên module này. "fs" lo việc đọc ghi tệp và thư mục, không tạo máy chủ. "url" dùng để phân tích và dựng chuỗi URL, như tách pathname hay query, không lắng nghe kết nối. "net" thật ra cũng có net.createServer, nhưng nó tạo máy chủ TCP ở mức thấp, chỉ nhận luồng byte thô và không hiểu HTTP; module http được xây trên net để thêm phần phân tích request và response HTTP, nên khi nói tạo máy chủ cho ứng dụng web thì module được dùng là http.
Mở trang câu hỏi này →
45What is CSRF in web security?4 lựa chọnDễ
AA type of data encryption
BCross-Site Request Forgery
CA way to secure tokens
DCross-Service Response Failure
Lời giải
Đáp án đúng: "Cross-Site Request Forgery". CSRF (giả mạo yêu cầu liên trang) là kiểu tấn công trong đó một trang độc hại khiến trình duyệt của nạn nhân gửi request tới trang đích mà nạn nhân đang đăng nhập; trình duyệt tự đính kèm cookie phiên nên máy chủ tưởng đó là thao tác thật. Cách chống gồm token CSRF ngẫu nhiên nhúng trong form, cookie SameSite và kiểm tra header Origin. "A type of data encryption" sai vì CSRF là một lỗ hổng, không phải thuật toán mã hoá. "A way to secure tokens" đảo ngược quan hệ: token CSRF là biện pháp chống tấn công, còn CSRF là chính cuộc tấn công. "Cross-Service Response Failure" là cụm từ sai cả ba chữ sau: đúng phải là Site (trang), Request (yêu cầu) và Forgery (giả mạo).
Mở trang câu hỏi này →
A{{loop}}
B{{foreach}}
C{{#if}}
D{{logic}}
Lời giải

Đáp án đúng: "{{#

Lời giải
if
}
}
". Handlebars

có sẵn một nhóm block helper gồm if, unless, each, with, cùng các helper lookup và log; block helper được mở bằng dấu thăng ngay sau hai ngoặc nhọn và đóng bằng dấu gạch chéo, nội dung bên trong khối if chỉ hiển thị khi giá trị truyền vào là truthy. "{{loop}}" không phải helper có sẵn; lặp trong Handlebars dùng each. "{{

Lời giải
foreach
}
}
"

là cách đặt tên quen thuộc của PHP hay C#, Handlebars không định nghĩa, muốn có phải tự đăng ký bằng Handlebars.registerHelper. "{{logic}}" không tồn tại; Handlebars cố tình hạn chế logic trong template, chỉ cung cấp vài helper điều kiện và lặp đơn giản.

Mở trang câu hỏi này →
AKey-Value Store
BDocument-Based Store
CColumn-Based Store
DGraph-Based Store
Lời giải
Đáp án đúng: "Graph-Based Store". Cơ sở dữ liệu đồ thị như Neo4j lưu dữ liệu thành nút (node) và cạnh (edge), trong đó quan hệ là thực thể hạng nhất có thể mang thuộc tính; duyệt quan hệ nhiều tầng như bạn của bạn hay gợi ý sản phẩm đi theo liên kết trực tiếp thay vì phép nối tốn kém, nên hợp nhất khi ứng dụng ưu tiên quan hệ giữa các thực thể. "Key-Value Store" như Redis chỉ ánh xạ khoá sang giá trị, tra cứu theo khoá rất nhanh nhưng không biểu diễn quan hệ. "Document-Based Store" như MongoDB mạnh khi dữ liệu gom thành tài liệu tự chứa; quan hệ phải dùng tham chiếu cùng populate hay $lookup, kém hiệu quả khi duyệt sâu. "Column-Based Store" như Cassandra tối ưu cho ghi khối lượng lớn và đọc theo cột, không nhằm vào quan hệ.
Mở trang câu hỏi này →
A<% users.forEach(user => { %> <%= user %> <% }); %>
B{ users.map(user => {user} ) }
C<% users.forEach(user => { %>{ user }<% }); %>
D<%= users.forEach(user => { %> <%= user %> <% }); %>
Lời giải

Đáp án đúng: "<%

Lời giải
users.forEach(user => {
  %> <%= user %> <%
}

); %>". EJS phân biệt hai loại thẻ: thẻ <% … %> chỉ chạy mã JavaScript và không in gì, còn thẻ <%= … %> in giá trị của biểu thức sau khi thoát ký tự HTML. Lần theo đoạn mã: dòng đầu mở vòng forEach trên mảng users, dòng giữa in giá trị user ở mỗi lượt lặp, dòng cuối đóng hàm và vòng lặp, nên mỗi tên trong mảng được in một lần (giả sử users chứa tên; nếu là đối tượng thì in user.name). "{

Lời giải
users.map(user => {
  user
}

) }" là cú pháp JSX của React, EJS không hiểu dấu ngoặc nhọn đơn nên in nguyên văn chuỗi đó ra trang. "<%

Lời giải
users.forEach(user => {
  %>{
    user
  }
  <%
}

); %>" có vòng lặp đúng nhưng phần giữa nằm ngoài thẻ EJS, nên mỗi lượt chỉ in ra chữ thô { user } thay vì tên. "<%=

Lời giải
users.forEach(user => {
  %> <%= user %> <%
}

); %>" dùng thẻ in cho dòng mở vòng lặp, EJS sẽ cố biến đoạn chưa đóng đó thành một biểu thức cần in nên khi biên dịch template sẽ báo lỗi cú pháp.

Mở trang câu hỏi này →
AGET
BPOST
CPUT
DDELETE
Lời giải
Đáp án đúng: "PUT". Theo quy ước REST, PUT gửi biểu diễn đầy đủ của tài nguyên tới URL của nó, như PUT /users/42, để thay thế bản hiện có, và có tính idempotent (lặp lại nhiều lần vẫn cho cùng kết quả); khi chỉ sửa một phần thường dùng PATCH. Trong Express, thao tác này ứng với app.put('/users/:id', handler). "GET" chỉ đọc tài nguyên và không được làm thay đổi dữ liệu trên máy chủ. "POST" thường dùng để tạo tài nguyên mới trong một tập hợp như POST /users, mỗi lần gọi có thể tạo thêm một bản ghi nên không idempotent. "DELETE" dùng để xoá tài nguyên khỏi máy chủ chứ không cập nhật nội dung của nó.
Mở trang câu hỏi này →
AStep 1 is to create a new database reference using client.db('library') Step 2 is to create a new collection using await db.createCollection('books'); Step 3 is to list all databases using await adminDb.listDatabases();
BStep 1 is to create a new collection using await db.createCollection('books'); Step 2 is to create a new database reference using client.db('library') Step 3 is to list all databases using await adminDb.listDatabases();
CStep 1 is to list all databases using await adminDb.listDatabases(); Step 2 is to create a new collection using await db.createCollection('books'); Step 3 is to create a new database reference using client.db('library')
DStep 1 is to list all databases using await adminDb.listDatabases(); Step 2 is to create a new database reference using client.db('library') Step 3 is to create a new collection using await db.createCollection('books');
Lời giải

Đáp án đúng: "Step 1 is to create a

Lời giải
new database reference using client.db('library') Step 2 is to create a new collection using await db.createCollection('books');

Step 3 is to list all databases using await adminDb.listDatabases(); ". Sau khi client.connect() xong, client.db('library') chỉ tạo một tham chiếu tới cơ sở dữ liệu, MongoDB tạo nó thật khi có collection hoặc dữ liệu đầu tiên; vì vậy phải có tham chiếu db trước thì mới gọi được db.createCollection('books'), và lệnh này làm library thực sự xuất hiện trên máy chủ. Cuối cùng adminDb, lấy từ client.db().admin(), gọi listDatabases() thì danh sách đã có library. Thứ tự mở đầu bằng "Step 1 is to create a new collection" sai vì biến db chưa tồn tại lúc gọi createCollection. Thứ tự "Step 1 is to list all databases using await adminDb.listDatabases(); Step 2 is to create a new collection" vừa liệt kê quá sớm khi library chưa có trong danh sách, vừa tạo collection trước khi có tham chiếu db. Thứ tự "Step 1 is to list all databases using await adminDb.listDatabases(); Step 2 is to create a new database reference" tạo đúng trình tự nhưng liệt kê trước nên không thấy library vừa tạo, trái yêu cầu.

Mở trang câu hỏi này →