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.
router.delete('/comments/:id')router.get('/comments/:id')router.post('/comments/:id')router.put('/comments/:id')const express = require('express');
const app = express();
app.use('/api', (req, res, next) => {
console.log('Middleware');
next();
});
app.get('/api', (req, res) => res.send('API'));
app.listen(3000);Middleware
APIIaaSPaaSBaaSSaaSconst express = require('express');
const app = express();
app.all('/users', (req, res, next) => {
console.log('Accessing the /users endpoint...');
next(); // pass control to the next handler
});
app.delete('/users', (req, res) => {
res.send('DELETE request to the /users endpoint');
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});deleteManyremoveDocumentsdeleteOneremoveManyexpress.urlencoded()express.static()express.json()express.parse()const userSchema = new mongoose.Schema({
name: String,
age: Number
});Đá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.
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>
<div>
<h1>Charlie</h1>
<ul>
<li>reading</li>
<li>gaming</li>
</ul>
</div><div>
<h1>Charlie</h1>
<ul></ul>
</div><div>
<h1>undefined</h1>
<ul>
<li>reading</li>
<li>gaming</li>
</ul>
</div>Đáp án đúng: "
<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 đủ.
Step 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();Step 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();Step 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')Step 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');Đáp án đúng: "Step 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(); ". 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.
<% users.forEach(user => { %>
<%= user %>
<% }); %>{ users.map(user =>
{user}
) }<%= users.forEach(user => { %>
<%= user %>
<% }); %>Đáp án đúng: "<%
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). "{
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. "<%
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. "<%=
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.