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.
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.
Đáp án đúng: "{{#
if
}
}
". Handlebarscó 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. "{{
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.
const express = require('express');
const mongoose = require('mongoose');
const app = express();mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
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" }.
mongoose.createSchema()mongoose.newSchema()mongoose.Schemamongoose.modelSQLNoSQLRelationalHierarchicalconst 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);