Câu hỏi: SDN302 Server-Side development with NodeJS, Express, and MongoDB – Bộ ôn tập thi lại số 2
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 2/3 — câu 21–40.
Danh sách câu hỏi
Đáp án đúng gồm hai ý: "
new Schema({
fieldName: String
}, { timestamps: true })" và "
new Schema({
fieldName: String
}).set('timestamps', true)". timestamps là tuỳ chọn của cả schema: truyền nó ở đối số thứ hai khi tạo Schema, hoặc đặt sau bằng phương thức set của schema trước khi biên dịch thành model, đều khiến Mongoose tự thêm hai trường createdAt và updatedAt rồi cập nhật chúng mỗi lần lưu. "
new Schema({
fieldName: {
type: String, timestamps: true
}
})" sai vì timestamps đặt bên trong định nghĩa một trường không phải tuỳ chọn hợp lệ của SchemaType, Mongoose bỏ qua nó nên không có trường thời gian nào được thêm. "
new Schema({
fieldName: String
}, { timestamps: false })" là cú pháp hợp lệ nhưng tắt tính năng, nên schema tạo ra không có timestamps như câu hỏi yêu cầu.
const express = require('express');
const mongoose = require('mongoose');
const app = express();
app.use(express.json());mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
const userSchema = new mongoose.Schema({ name: String, email: String });
const User = mongoose.model('User', userSchema);
app.post('/api/users', async (req, res) => {
try {
const user = await User.create(req.body);
res.status(201).json(user);
} catch (err) {
res.status(400).json({ error: err.message });
}
});
app.listen(3000);IaaSPaaSBaaSSaaSconst 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
APIĐáp án đúng: "
fs.access(filePath, fs.constants.F_OK, (err) => {
...
});". fs.access kiểm tra quyền truy cập của tiến trình tới một đường dẫn; truyền cờ fs.constants.F_OK nghĩa là chỉ hỏi tệp có tồn tại hay không, và callback nhận err (thường mang mã ENOENT) khi tệp không có, nhận null khi có, đúng quy ước lỗi trước (error-first) của Node.js. Chỗ dễ tranh cãi là "
fs.exists(filePath, function(exists) {
. . .
});": đây cũng là hàm bất đồng bộ có thật, callback nhận một giá trị boolean, nhưng tài liệu Node.js đã đánh dấu nó deprecated (ngừng khuyên dùng) từ lâu chính vì callback không theo quy ước lỗi trước, và khuyên thay bằng fs.access hoặc fs.stat; vì vậy cách chuẩn hiện nay là fs.access. "
fs.existsFile(filePath, function(exists) {
. . .
});" không tồn tại trong module fs. "
fs.fileExists(filePath, function(exists) {
. . .
});" cũng là tên không có trong API, gọi sẽ báo lỗi không phải hàm.
router.delete('/comments/:id')router.get('/comments/:id')router.post('/comments/:id')router.put('/comments/:id')// app.js
app.get('/', (req, res) => res.render('home', { title: 'Home' }));
// home.ejs
<h1><%= title %></h1>Đáp án đúng: "<h1>Home</h1> ". Lần theo mã: route GET / gọi res.render với tên home và đối tượng có title là Home, Express tìm tệp views/home.ejs và đưa dữ liệu cho EJS; thẻ <%= title %> là thẻ xuất giá trị có thoát ký tự HTML (escape), EJS thay nó bằng giá trị biến title là Home, nên trình duyệt nhận HTML hoàn chỉnh với thẻ h1 chứa chữ Home. "<h1><%= title %></h1> " sai vì đó là mã mẫu trước khi kết xuất; thẻ EJS không lọt nguyên ra phản hồi khi render thành công. "Template string if data not passed correctly" sai vì nếu thiếu title, EJS ném lỗi ReferenceError chứ không in lại chuỗi mẫu, và ở đây dữ liệu đã được truyền đúng. "Dynamic content based on passed object" mô tả chung bản chất của EJS nhưng không nói kết quả cụ thể, trong khi câu hỏi cần đầu ra chính xác.