Tất cả câu hỏi

Ngân hàng câu hỏi trắc nghiệm có giải thích chi tiết.

5.980/20.347 câuCòn 14.367
ACreates new author documents
BReplaces referenced ObjectId with actual related author document
CSorts authors alphabetically
DEncrypts author field
Lời giải
Đáp án đúng: "Replaces referenced ObjectId with actual related author document". Khi trường author của schema lưu ObjectId kèm ref tới model tác giả, lời gọi populate với tên trường author làm Mongoose chạy thêm một truy vấn vào collection được tham chiếu và thay giá trị ObjectId trong kết quả bằng nguyên tài liệu tác giả, nên có thể đọc ngay post.author.name; dữ liệu lưu trong cơ sở dữ liệu vẫn chỉ là ObjectId. "Creates new author documents" sai vì populate chỉ đọc, không ghi tài liệu nào. "Sorts authors alphabetically" sai vì sắp xếp là việc của sort(); populate có thể nhận tuỳ chọn sắp xếp cho tài liệu con nhưng tự nó không sắp xếp. "Encrypts author field" sai vì populate không mã hoá dữ liệu; mã hoá trường cần plugin hoặc tính năng mã hoá riêng của MongoDB.
Mở trang câu hỏi này →
AAWS
BHeroku
CFirebase
DDigitalOcean
Lời giải
Đáp án đúng: "Firebase". BaaS (Backend as a Service, phần phụ trợ dưới dạng dịch vụ) cung cấp sẵn những khối mà ứng dụng thường phải tự viết ở máy chủ: cơ sở dữ liệu, xác thực, lưu trữ tệp, hàm chạy phía máy chủ. Firebase thuộc Google, nổi bật với Cloud Firestore (cơ sở dữ liệu NoSQL dạng document đồng bộ thời gian thực), Cloud Functions (hàm serverless chạy khi có sự kiện), Authentication và Hosting. "AWS" là nền tảng đám mây của Amazon; AWS cũng có dịch vụ kiểu BaaS là Amplify, nhưng không phải của Google và không có Firestore. "Heroku" là PaaS (nền tảng triển khai ứng dụng) thuộc Salesforce, nơi bạn đưa mã máy chủ của mình lên chạy chứ không có sẵn Firestore hay Cloud Functions. "DigitalOcean" là nhà cung cấp hạ tầng đám mây như máy ảo Droplet, thuộc nhóm IaaS, cũng không do Google phát triển.
Mở trang câu hỏi này →
AUser.saveAll()
BUser.insertOne()
CUser.create({...})
DUser.make({...})
Lời giải

Đáp án đúng: "

Lời giải
User.create({
  ...
}

)". Trong Mongoose, Model.create(doc) dựng một document từ object truyền vào, chạy validation và các pre hook save, lưu xuống MongoDB rồi trả về Promise chứa chính document vừa tạo, đã có _id và các giá trị mặc định, nên đáp ứng đủ hai yêu cầu chèn mới và trả về đối tượng. "User.insertOne()" gợi nhớ phương thức insertOne của collection trong driver mongodb gốc, vốn chỉ trả về object xác nhận chứa insertedId chứ không trả về tài liệu đã tạo, và lời gọi rỗng như vậy cũng không có dữ liệu để chèn. "User.saveAll()" không tồn tại trong Mongoose; save() là phương thức của từng document, còn chèn nhiều tài liệu thì dùng insertMany(). "

Lời giải
User.make({
  ...
}

)" cũng không phải API nào của Mongoose.

Mở trang câu hỏi này →
A.populate() only works with arrays
BWrong path name used in populate
Cfind() must come after populate
DObjectId cannot reference User model
Lời giải
Đáp án đúng: "Wrong path name used in populate". Đối số của populate() là tên đường dẫn (path) có trong schema chứ không phải tên tuỳ ý; schema chỉ có trường author với ref tới User, còn mã lại gọi populate với writer. Từ Mongoose 6, tuỳ chọn strictPopulate mặc định bật nên lệnh này ném lỗi báo không thể populate path writer vì nó không có trong schema; ở bản cũ hơn nó lặng lẽ không làm gì và author vẫn là ObjectId. Cách sửa là populate với author. ".populate() only works with arrays" sai vì populate dùng được cho cả trường ObjectId đơn lẫn mảng ObjectId. "find() must come after populate" sai vì populate là method nối vào query do find() trả về, nên thứ tự Post.find().populate(...) là đúng. "ObjectId cannot reference User model" sai vì khai báo type ObjectId kèm ref tới User chính là cách tham chiếu chuẩn.
Mở trang câu hỏi này →
A/getOrdersByCustomer/88
B/orders/customer/88/get
C/customers/88/orders
D/orders?id=88&customer=true
Lời giải
Đáp án đúng: "/customers/88/orders". Thiết kế REST đặt tên endpoint theo danh từ chỉ tài nguyên, để phương thức HTTP nói lên hành động, và biểu diễn quan hệ cha con bằng đường dẫn lồng: /customers/88 là khách hàng id 88, thêm /orders là tập đơn hàng thuộc khách đó, gọi bằng GET là đọc. "/getOrdersByCustomer/88" nhét động từ get vào URL theo kiểu gọi hàm (RPC), trùng lặp với ý nghĩa của phương thức GET và khó mở rộng thành bộ endpoint thống nhất. "/orders/customer/88/get" vừa có động từ get ở cuối, vừa dùng customer số ít làm đoạn trung gian không phải một tài nguyên rõ ràng. "/orders?id=88&customer=true" gây hiểu nhầm: tham số id thường hiểu là id của chính đơn hàng, còn customer=true là cờ mơ hồ; nếu muốn lọc bằng query thì phải viết rõ kiểu customerId bằng 88.
Mở trang câu hỏi này →
AIt does not support any query language
BIt stores data mainly as flexible documents instead of relational tables
CIt only works without internet connection
DIt cannot store structured data
Lời giải
Đáp án đúng: "It stores data mainly as flexible documents instead of relational tables". NoSQL (không chỉ SQL) chỉ nhóm cơ sở dữ liệu không dùng mô hình bảng quan hệ; MongoDB là cơ sở dữ liệu hướng tài liệu, lưu dữ liệu thành các document BSON trong collection, mỗi document có thể có cấu trúc khác nhau và lồng mảng, object con, thay vì hàng và cột cố định nối nhau bằng khoá ngoại. "It does not support any query language" sai vì MongoDB có ngôn ngữ truy vấn riêng (MQL) với find, các toán tử như $gt, $in và aggregation pipeline. "It only works without internet connection" sai vì MongoDB là máy chủ phục vụ qua mạng, kể cả dịch vụ đám mây Atlas. "It cannot store structured data" sai vì document vẫn có cấu trúc rõ ràng và Mongoose còn cho định nghĩa schema chặt chẽ; khác biệt là cấu trúc linh hoạt chứ không phải không có cấu trúc.
Mở trang câu hỏi này →
5967What is the output of the following Node.js code?4 lựa chọncó code
Đề bài
const fs = require('fs');
function readTwoFiles(file1, file2, callback) {
  fs.readFile(file1, 'utf8', (err, data1) => {
    if (err) return callback(err);
    fs.readFile(file2, 'utf8', (err, data2) => {
      if (err) return callback(err);
      callback(null, data1 + data2);
    });
  });
}
readTwoFiles('file1.txt', 'file2.txt', (err, result) => {
  if (err) {
    console.log('Error:', err.message);
  } else {
    console.log('Result:', result);
  }
});

Assume 'file1.txt' contains "Hello" and 'file2.txt' does NOT exist.

AResult: Hello
BError: ENOENT: no such file or directory, open 'file2.txt'
CError: ENOENT: no such file or directory, open 'file1.txt'
DResult: undefined
Lời giải
Đáp án đúng: "Error: ENOENT: no such file or directory, open 'file2.txt'". Lần theo mã: readTwoFiles gọi fs.readFile cho file1.txt, tệp tồn tại nên err là null và data1 bằng Hello; trong callback đó nó gọi tiếp fs.readFile cho file2.txt, tệp không tồn tại nên Node trả lỗi có code ENOENT với thông điệp no such file or directory, open 'file2.txt'; nhánh if (err) return callback(err) chuyển lỗi ra ngoài và callback cuối chạy console.log('Error:', err.message), in chữ Error: rồi một dấu cách và thông điệp lỗi. "Result: Hello" sai vì callback(null, data1 + data2) chỉ chạy khi cả hai lần đọc đều thành công. "Error: ENOENT: no such file or directory, open 'file1.txt'" sai vì file1.txt đọc được, lỗi phát sinh ở tệp thứ hai. "Result: undefined" sai vì khi có lỗi mã thoát sớm bằng return, nhánh in Result không bao giờ chạy.
Mở trang câu hỏi này →
ATo render HTML pages
BTo define document structure, validation, and rules
CTo replace MongoDB server
DTo encrypt collections automatically
Lời giải
Đáp án đúng: "To define document structure, validation, and rules". Mongoose là một ODM (Object Data Modeling, ánh xạ đối tượng sang dữ liệu) cho MongoDB, và Schema là nơi mô tả hình dạng của document trong một collection: có những trường nào, kiểu dữ liệu ra sao, ràng buộc như required, min, max, enum, giá trị mặc định, cùng các hook và phương thức. MongoDB vốn không ép cấu trúc, nên schema giúp ứng dụng giữ dữ liệu nhất quán trước khi lưu. "To render HTML pages" là việc của view engine như EJS, Pug hay Handlebars qua res.render, không liên quan tới schema. "To replace MongoDB server" sai vì Mongoose chạy trong ứng dụng Node.js và vẫn cần một máy chủ MongoDB thật để kết nối qua driver. "To encrypt collections automatically" sai vì schema không mã hoá dữ liệu; mã hoá cấp trường là tính năng riêng của MongoDB như Client-Side Field Level Encryption, không phải mục đích của schema.
Mở trang câu hỏi này →
Đề bài
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
  res.send('respond with a resource');
});
module.exports = router;
Arespond with a resource
B404 status with 'Cannot GET /users'
C{ message: 'Users route' }
DThrows an error due to missing route
Lời giải
Đáp án đúng: "respond with a resource". Lần theo mã: app.js do express-generator sinh ra có dòng app.use('/users', usersRouter), gắn router của users.js vào tiền tố /users; trong router, router.get('/') khớp phần đường dẫn còn lại sau tiền tố, nên GET http://localhost:3000/users rơi đúng vào handler này và res.send gửi chuỗi respond with a resource với mã 200, kiểu text/html. "404 status with 'Cannot GET /users'" chỉ xảy ra khi không có route nào khớp, trong khi mẫu mặc định đã gắn sẵn usersRouter. "{ message: 'Users route' }" sai vì handler gửi chuỗi chứ không gửi object JSON, và nội dung đó không có trong mã. "Throws an error due to missing route" sai vì route tồn tại và chạy bình thường, server khởi động ở cổng 3000 theo tệp bin/www.
Mở trang câu hỏi này →
Adestination: function (req, file, cb) { cb(null, 'files/'); }
Bdestination: function (req, file, cb) { cb(null, 'uploads/'); }
Cfilename: function (req, file, cb) { cb(null, 'uploads/'); }
Dstorage: function (req, file, cb) { cb(null, 'uploads/'); }
Lời giải
Đáp án đúng: "destination: function (req, file, cb) { cb(null, 'uploads/'); }". Khi cấu hình multer.diskStorage với hai khoá destination và filename, hàm destination nhận req, file và callback cb; gọi cb(null, 'uploads/') nghĩa là không có lỗi (đối số đầu là null) và lưu tệp vào thư mục uploads. Lưu ý khi destination là hàm, Multer không tự tạo thư mục, nên uploads phải có sẵn. Đoạn trả về "cb(null, 'files/')" đặt đúng khoá destination nhưng ghi vào thư mục files, không phải uploads như yêu cầu. "filename: function (req, file, cb) { cb(null, 'uploads/'); }" đặt sai khoá: filename quyết định tên tệp được lưu, truyền 'uploads/' vào đó sẽ thành tên tệp chứ không chọn được thư mục. "storage: function (req, file, cb) { cb(null, 'uploads/'); }" sai vì storage là tuỳ chọn của multer() nhận một engine lưu trữ do multer.diskStorage() tạo ra, không phải một hàm callback chỉ thư mục.
Mở trang câu hỏi này →
AStoring in MongoDB for consistency
BUsing GridFS for large files in DB
CDisk storage with Multer
DIn-memory storage
Lời giải
Đáp án đúng: "Disk storage with Multer". Với multer.diskStorage, tệp được ghi thẳng xuống hệ thống tệp theo dạng luồng, cơ sở dữ liệu chỉ lưu metadata nhẹ như tên tệp, đường dẫn, kích thước; nhờ vậy MongoDB không phải gánh khối dữ liệu nhị phân lớn, sao lưu và truy vấn nhẹ hơn, còn phần lưu trữ tệp có thể mở rộng riêng (thêm ổ đĩa, chuyển sang dịch vụ lưu trữ đối tượng). "Storing in MongoDB for consistency" bị giới hạn bởi kích thước tối đa 16 MB của một document BSON và làm phình cơ sở dữ liệu, nên không phù hợp với tệp lớn. "Using GridFS for large files in DB" là cách MongoDB chia tệp vượt 16 MB thành nhiều chunk và vẫn dùng được, nhưng toàn bộ dữ liệu tệp vẫn nằm trong cơ sở dữ liệu nên tải đọc ghi và dung lượng dồn lên MongoDB, kém linh hoạt hơn khi tệp nhiều và lớn. "In-memory storage" (multer.memoryStorage) giữ cả tệp trong RAM dưới dạng Buffer, tệp lớn hoặc nhiều request đồng thời dễ làm cạn bộ nhớ tiến trình.
Mở trang câu hỏi này →
5972What is the output of the following Node.js code?4 lựa chọncó code
Đề bài
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
async function main() {
  try {
    const data = await readFile('config.json', 'utf8');
    console.log('Success:', data);
  } catch (err) {
    console.log('Error:', err.message);
  }
  console.log('Done');
}
main();

Assume 'config.json' does NOT exist.

ASuccess: undefined Done
BError: ENOENT: no such file or directory, open 'config.json' Done
CDone Error: ENOENT: no such file or directory, open 'config.json'
DThrows an unhandled promise rejection
Lời giải
Đáp án đúng: "Error: ENOENT: no such file or directory, open 'config.json' Done". Lần theo mã: util.promisify biến fs.readFile kiểu callback thành hàm trả về Promise; trong main, await readFile('config.json', 'utf8') chờ Promise đó, và vì tệp không tồn tại nên Promise bị reject với lỗi mã ENOENT, message là ENOENT: no such file or directory, open 'config.json'; await ném lỗi vào khối catch, in dòng Error kèm message, rồi chạy tiếp ra ngoài try/catch in Done, nên hai dòng xuất hiện theo thứ tự lỗi trước, Done sau. "Success: undefined Done" sai vì dòng Success chỉ chạy khi đọc tệp thành công, ở đây readFile thất bại nên lệnh đó bị bỏ qua. "Done Error: ENOENT: no such file or directory" sai thứ tự: await làm main dừng chờ, còn console.log('Done') đứng sau toàn bộ try/catch nên không thể in trước lỗi. "Throws an unhandled promise rejection" sai vì lỗi đã được bắt bởi catch bên trong hàm async, Promise của main hoàn tất bình thường.
Mở trang câu hỏi này →
Đề bài
const fs = require('fs');
fs.readFile('file.txt', 'utf8', (err, data) => {
    if (err) console.log('Error occurred');
    else console.log(data);
});
console.log('Reading file');
AReading file Error occurred
BError occurred Reading file
CLogs reading then handles file absence gracefully
DOnly reading log if file check skipped
Lời giải
Đáp án đúng: "Reading file Error occurred". Hàm fs.readFile là bất đồng bộ: nó giao việc đọc tệp cho libuv rồi trả về ngay, callback chỉ được gọi ở một lượt event loop sau khi thao tác I/O xong. Lần theo mã: lệnh gọi readFile đăng ký callback, tiếp theo console.log('Reading file') chạy đồng bộ nên dòng Reading file được in trước; sau đó việc mở file.txt thất bại với lỗi ENOENT, callback nhận err khác null nên vào nhánh if và in Error occurred. "Error occurred Reading file" sai thứ tự vì callback không thể chạy trước phần mã đồng bộ còn lại của chương trình. "Logs reading then handles file absence gracefully" mô tả bằng lời đúng tinh thần nhưng không cho biết chính xác những gì được in, trong khi câu hỏi cần kết quả cụ thể trên console, nên phương án ghi rõ hai dòng theo đúng thứ tự mới là lựa chọn chính xác. "Only reading log if file check skipped" sai vì mã không có bước kiểm tra tệp nào bị bỏ qua, cả hai lệnh log đều chạy.
Mở trang câu hỏi này →
AA new programming language developed by Mozilla
BA JavaScript runtime environment for server-side development
CA framework like React or Angular
DA NoSQL database system
Lời giải
Đáp án đúng: "A JavaScript runtime environment for server-side development". Node.js là môi trường chạy (runtime) JavaScript dựng trên engine V8 của Chrome, bổ sung vòng lặp sự kiện (event loop) và I/O bất đồng bộ qua libuv cùng các module như fs, http, nhờ đó JavaScript chạy được ngoài trình duyệt để viết máy chủ web và công cụ dòng lệnh. "A new programming language developed by Mozilla" sai hai chỗ: Node.js không phải ngôn ngữ mới mà chạy chính JavaScript, và nó không do Mozilla phát triển. "A framework like React or Angular" sai vì React và Angular là thư viện, framework giao diện chạy ở trình duyệt, còn Node.js là nền chạy mà các framework như Express dựng lên trên. "A NoSQL database system" sai vì Node.js không lưu dữ liệu; nó kết nối tới cơ sở dữ liệu NoSQL như MongoDB thông qua driver.
Mở trang câu hỏi này →
Afs
Bhttp
Cexpress
Dpath
Lời giải
Đáp án đúng: "express". Đây là câu phủ định: cần chọn thứ không phải core module (module lõi, có sẵn khi cài Node.js). Express là framework web của bên thứ ba, phân phối qua npm, phải chạy npm install express rồi mới require được và nó nằm trong thư mục node_modules của dự án. "fs" là core module dùng đọc, ghi, xoá tệp và thư mục, như fs.readFile hay fs.writeFile, nên đúng là module lõi và không được chọn. "http" là core module dùng tạo máy chủ và gửi request HTTP bằng http.createServer hay http.request; chính Express cũng dựng trên module này. "path" là core module xử lý đường dẫn tệp, ví dụ path.join và path.resolve, giúp ghép đường dẫn đúng trên mọi hệ điều hành. Cả ba đều require được ngay mà không cần cài thêm gói nào.
Mở trang câu hỏi này →
Đề bài
const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/db');

Đề bài
const childSchema = new mongoose.Schema({ name: String });
const parentSchema = new mongoose.Schema({ child: { type: mongoose.Schema.Types.ObjectId, ref: 'Child' } });
const Child = mongoose.model('Child', childSchema);
const Parent = mongoose.model('Parent', parentSchema);
async function run() {
    const child = await Child.create({ name: 'Kid' });
    await Parent.create({ child: child._id });
    const parent = await Parent.findOne().populate('child');
    console.log(parent.child.name);
}
run();
AKid
BThe child's name if reference resolved
CFull parent document with embedded child
DPopulated field value from linked model
Lời giải

Đáp án đúng: "Kid". Lần theo mã:

Lời giải
Child.create({
  name: 'Kid'
}

) tạo tài liệu con và trả về nó kèm _id; Parent.create lưu một tài liệu cha có trường child chỉ chứa ObjectId đó, vì parentSchema khai báo child là ObjectId với ref: 'Child'; Parent.findOne().populate('child') dùng ref để truy vấn thêm collection của model Child và thay ObjectId bằng cả tài liệu con, nên parent.child là object có name bằng Kid, và console.log(parent.child.name) in ra Kid. "The child's name if reference resolved" chỉ mô tả có điều kiện, không phải chuỗi in ra cụ thể. "Full parent document with embedded child" sai vì lệnh log chỉ in thuộc tính name, không in cả tài liệu cha. "Populated field value from linked model" là mô tả chung về cơ chế populate, không nêu kết quả cụ thể mà câu hỏi cần.

Mở trang câu hỏi này →
AfindJoin()
Bpopulate()
CjoinWith()
DrefFetch()
Lời giải
Đáp án đúng: "populate()". Khi schema khai báo một trường kiểu Schema.Types.ObjectId kèm ref trỏ tới model User, truy vấn như Post.find().populate('author') sẽ chạy thêm truy vấn vào collection users và thay mỗi ObjectId bằng tài liệu tương ứng; đây là cách Mongoose nạp tài liệu được tham chiếu. "findJoin()" không có trong API Mongoose, tên này chỉ ghép từ find với JOIN của SQL. "joinWith()" cũng không tồn tại; muốn nối ngay ở phía máy chủ MongoDB thì dùng stage $lookup trong aggregate(), không phải hàm này. "refFetch()" được ghép từ chữ ref của khai báo schema, Mongoose không có hàm nào mang tên đó, gọi nó sẽ báo lỗi không phải hàm.
Mở trang câu hỏi này →
Adefault: 18
Brequired: true
Cvalidate: {}
Dimmutable: true
Lời giải
Đáp án đúng: "default: 18". Trong định nghĩa schema Mongoose, tuỳ chọn default gán giá trị mặc định cho trường khi tài liệu mới được tạo mà không cung cấp trường đó, ví dụ age: { type: Number, default: 18 } làm mọi người dùng mới thiếu age có age bằng 18; default còn nhận một hàm như Date.now để tính lúc tạo. "required: true" là validator bắt buộc phải có giá trị, thiếu thì save() báo lỗi chứ không tự điền. "validate: {}" khai báo hàm kiểm tra tuỳ chỉnh để chấp nhận hay từ chối giá trị, không sinh giá trị nào. "immutable: true" khiến trường không đổi được sau khi tài liệu đã lưu lần đầu, cũng không đặt giá trị mặc định.
Mở trang câu hỏi này →
Aexpress.static
Bexpress.json
Cexpress.session
Dexpress.urlencoded
Lời giải
Đáp án đúng: "express.session". Từ Express 4, các middleware dựng sẵn chỉ còn express.static (phục vụ tệp tĩnh), express.json và express.urlencoded (phân tích body JSON và form, có từ bản 4.16), cùng express.raw và express.text; quản lý phiên (session) đã được tách thành gói riêng express-session phải cài thêm và nạp qua require('express-session'), nên express.session không tồn tại. "express.static" là middleware có sẵn, phục vụ ảnh, CSS, JavaScript từ một thư mục. "express.json" là middleware có sẵn, đọc body có Content-Type application/json và gán vào req.body. "express.urlencoded" là middleware có sẵn, phân tích dữ liệu form dạng application/x-www-form-urlencoded. Cả express.static, express.json và express.urlencoded đều tích hợp sẵn nên không được chọn trong câu hỏi phủ định này.
Mở trang câu hỏi này →
Aapp.get('/logout', (req, res) => { req.session.destroy((err) => { if (err) { console.log(err); } else { res.redirect('/login'); } }); });
Bapp.get('/logout', (req, res) => { req.session.delete(); res.redirect('/login'); });
Capp.get('/logout', (req, res) => { req.session.remove(); res.redirect('/login'); });
Dapp.get('/logout', (req, res) => { req.session.invalidate(); res.redirect('/login'); });
Lời giải

Đáp án đúng: "

Lời giải
app.get('/logout', (req, res) => {
  req.session.destroy((err) => {
    if (err) {
      console.log(err);
    }
    else {
      res.redirect('/login');
    }
  }
  );
}

);". Gói express-session gắn vào req.session một đối tượng Session có phương thức destroy(callback): nó xoá dữ liệu phiên khỏi store, bỏ req.session rồi mới gọi callback. Lần theo đoạn đúng: route GET /logout gọi destroy, chờ trong callback, nếu có err thì ghi log, nếu không mới chạy res.redirect('/login'), nên việc chuyển hướng chỉ xảy ra khi phiên đã thật sự bị huỷ. Đoạn gọi "req.session.delete()" sai vì Session của express-session không có phương thức delete, lệnh này ném TypeError trước khi kịp chuyển hướng. Đoạn gọi "req.session.remove()" cũng sai vì remove không nằm trong API của Session, kết quả là lỗi không phải hàm như trên. Đoạn gọi "req.session.invalidate()" mượn cách viết của HttpSession trong Java Servlet, mang sang Express thì không tồn tại; hơn nữa nó gọi res.redirect ngay mà không chờ store xoá xong.

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