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.720/20.347 câuCòn 14.627
ATo set response status
BTo access incoming request metadata
CTo parse URL paths
DTo handle errors
Lời giải
Đáp án đúng: "To access incoming request metadata". Trong module http của Node.js, req là đối tượng IncomingMessage và req.headers là một đối tượng chứa các header của yêu cầu gửi tới, với tên header đã chuyển về chữ thường, ví dụ req.headers['content-type'] hay req.headers.authorization để đọc token; đó là siêu dữ liệu (metadata) mô tả yêu cầu. "To set response status" là việc của res, qua res.statusCode hoặc res.writeHead(). "To parse URL paths" thuộc về req.url kết hợp lớp URL hoặc module url, header không chứa đường dẫn cần phân tích. "To handle errors" không phải vai trò của header; lỗi được xử lý qua sự kiện error, try/catch hoặc middleware xử lý lỗi trong Express.
Mở trang câu hỏi này →
5702What does the following Mongoose schema represent?4 lựa chọncó code
Đề bài
const userSchema = new mongoose.Schema({
  name: String,
  age: Number
});
AA model definition
BA middleware function
CA schema structure for documents
DA MongoDB query
Lời giải

Đáp án đúng: "A schema structure for documents". Đoạn mã gọi new mongoose.Schema với hai trường, name kiểu String và age kiểu Number, tức là mô tả hình dạng mà mỗi document người dùng sẽ có; Mongoose dùng nó để ép kiểu (cast) và kiểm tra dữ liệu trước khi lưu. Bản thân userSchema chưa làm việc gì với cơ sở dữ liệu. "A model definition" sai vì model chỉ có khi đem schema biên dịch bằng mongoose.model('User', userSchema); khi đó mới gọi được find hay save. "A middleware function" sai vì middleware (hook) của Mongoose được gắn lên schema bằng userSchema.pre hoặc userSchema.post với một hàm, còn đoạn này chỉ khai báo trường. "A MongoDB query" sai vì truy vấn là lời gọi như User.find với bộ lọc, gửi yêu cầu tới máy chủ; khai báo schema không gửi gì tới MongoDB.

Mở trang câu hỏi này →
AApache License
BMIT License
CGNU General Public License
DBSD License
Lời giải
Đáp án đúng: "MIT License". Express.js được phát hành theo giấy phép MIT, một giấy phép mã nguồn mở dễ dãi (permissive): ai cũng được dùng, sửa, phân phối, kể cả trong sản phẩm thương mại đóng mã, chỉ cần giữ nguyên thông báo bản quyền và nội dung giấy phép; điều này ghi trong tệp LICENSE của kho mã và trường license của package.json. "Apache License" cũng là giấy phép dễ dãi, có thêm điều khoản cấp quyền sáng chế, nhưng Express không dùng nó. "GNU General Public License" là giấy phép copyleft buộc sản phẩm phái sinh phải mở mã theo cùng giấy phép, khác hẳn MIT và không phải giấy phép của Express. "BSD License" gần giống MIT về tinh thần nhưng là một họ giấy phép khác, Express không phát hành theo nó.
Mở trang câu hỏi này →
Đề bài
const express = require('express');
const exphbs = require('express-handlebars');
const app = express();
app.engine('handlebars', exphbs({ defaultLayout: false }));
app.set('view engine', 'handlebars');
app.get('/profile', (req, res) => {
  res.render('profile', { name: 'Charlie', hobbies: ['reading', 'gaming'] });
});
app.listen(3000);

// views/profile.handlebars
<div>
  <h1>{{name}}</h1>
  <ul>
    {{#each hobbies}}
      <li>{{this}}</li>

{{/each}} </ul> </div>

A<div> <h1>Charlie</h1> <ul> <li>reading</li> <li>gaming</li> </ul> </div>
B<div> <h1>Charlie</h1> <ul></ul> </div>
C<div> <h1>undefined</h1> <ul> <li>reading</li> <li>gaming</li> </ul> </div>
DThrows an error due to invalid Handlebars syntax
Lời giải

Đáp án đúng: "

Lời giải
<div>
  <h1>Charlie</h1>
  <ul>
    <li>reading</li>
    <li>gaming</li>
  </ul>
</div>

". Lần theo mã: app.engine đăng ký express-handlebars cho đuôi handlebars với defaultLayout false, nghĩa là không bọc layout ngoài, và app.set chọn nó làm view engine. Khi GET tới /profile, res.render tìm tệp views/profile.handlebars và truyền dữ liệu gồm name là Charlie, hobbies là mảng reading, gaming. Trong template, {{name}} được thay bằng Charlie; khối each lặp qua mảng hobbies, và trong mỗi lượt {{this}} là phần tử hiện tại, nên sinh ra hai thẻ li là reading và gaming. Cách gọi exphbs() trực tiếp như hàm là kiểu của các bản express-handlebars cũ (bản mới dùng exphbs.engine()), câu hỏi xét kết quả render với cấu hình chạy được này. "<div> <h1>Charlie</h1> <ul></ul> </div> " chỉ xảy ra khi hobbies rỗng hoặc không được truyền, trong khi dữ liệu có hai phần tử. Kết quả có <h1>undefined</h1> sai vì name đã được truyền, và kể cả khi thiếu, Handlebars in chuỗi rỗng chứ không in chữ undefined. "Throws an error due to invalid Handlebars syntax" sai vì mọi thẻ đều đúng cú pháp và khối each được đóng đầy đủ.

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 →
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 →
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 →
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 →
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 →
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 →
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 →
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 →
Đề 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 →
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 →
5715What 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 →
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 →
Đề 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 →
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 →
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 →
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 →