Server-Side development with NodeJS, Express, and MongoDB
Ôn luyện SDN302 – Phát triển Server-Side với Node.js, Express và MongoDB: ngân hàng câu hỏi trắc nghiệm có giải thích chi tiết, luyện thi cuối kỳ hiệu quả. Nội dung bao quát Node.js, npm, Event Loop bất đồng bộ, HTTP/HTTPS, Express.js, middleware, Express Generator, RESTful API, MongoDB & Mongoose, Mongoose Population, xác thực Passport/JWT, session & cookie, mã hoá bcrypt, upload/download file với Multer, CORS, OAuth và template EJS/Handlebars. Môn 3 tín chỉ tại FPT University, tiên quyết DBI202 và FER202.
Khi sử dụng Cross-origin resource sharing (CORS), việc hạn chế truy cập từ nguồn gốc khác nhau là rất quan trọng để ngăn chặn các rủi ro. Trong các lựa chọn trên, có một số không phải là các thực hành tốt để giảm thiểu rủi ro này. Đầu tiên, việc không hạn chế truy cập từ nguồn gốc khác nhau (Unrestricting Cross-Origin Access) là một trong những nguyên nhân chính dẫn đến các rủi ro. Điều này cho phép bất kỳ ai cũng có thể truy cập vào tài nguyên của bạn, ngay cả khi họ không phải là nguồn gốc chính thức. Thứ hai, việc sử dụng các phương thức HTTP không phù hợp (Using inappropriate HTTP methods) cũng có thể dẫn đến các rủi ro. Ví dụ, nếu bạn sử dụng phương thức HTTP POST để thực hiện một hành động không an toàn, nó có thể dẫn đến các lỗ hổng bảo mật. Cuối cùng, việc không sử dụng các cơ chế bảo vệ CSRF (Using CSRF protection mechanisms) cũng là một nguyên nhân dẫn đến các rủi ro. Điều này cho phép các kẻ tấn công thực hiện các hành động giả mạo trên tài nguyên của bạn.
HTTPS (HyperText Transfer Protocol Secure) là một giao thức truyền tải siêu văn bản an toàn, được sử dụng để truyền tải dữ liệu giữa máy chủ web và trình duyệt web. Mục đích chính của HTTPS là đảm bảo giao tiếp an toàn trên mạng. Điều này được thực hiện bằng cách mã hóa dữ liệu được truyền tải, ngăn chặn sự truy cập trái phép và bảo vệ thông tin cá nhân của người dùng. HTTPS sử dụng chứng chỉ SSL/TLS để xác thực danh tính của máy chủ web và mã hóa dữ liệu được truyền tải. Điều này giúp ngăn chặn các cuộc tấn công như nghe lén và giả mạo, đảm bảo rằng giao tiếp trên mạng là an toàn và đáng tin cậy.
Để tạo một dịch vụ mới trong NestJS, bạn cần sử dụng lệnh CLI (Command Line Interface) phù hợp. Trong các lựa chọn trên, lệnh "nest generate service" là câu trả lời chính xác. Lệnh này cho phép bạn tạo một dịch vụ mới với cấu trúc và các tệp tin cần thiết. Bạn có thể sử dụng lệnh này trong dự án NestJS để tạo các dịch vụ khác nhau, chẳng hạn như dịch vụ API, dịch vụ dữ liệu, v.v. Để sử dụng lệnh này, bạn cần mở terminal hoặc command prompt, sau đó nhập lệnh "nest generate service" và theo dõi các hướng dẫn trên màn hình để hoàn tất quá trình tạo dịch vụ.
AThe process of updating documents in a collection.
BThe process of embedding documents within other documents.
CThe process of automatically replacing the specified paths in the document with documents from other collections.
DThe process of validating documents before saving.
Lời giải
Trong Mongoose, population là một tính năng quan trọng giúp bạn liên kết các tài liệu (documents) trong một bộ sưu tập (collection) với các tài liệu khác trong các bộ sưu tập khác. Khi bạn thực hiện population, Mongoose sẽ tự động thay thế các đường dẫn (paths) trong tài liệu hiện tại bằng các tài liệu từ các bộ sưu tập khác. Điều này giúp bạn có thể truy cập và sử dụng dữ liệu từ các bộ sưu tập khác một cách dễ dàng và hiệu quả. Ví dụ, nếu bạn có một tài liệu đại diện cho một người và bạn muốn lấy thông tin về các bài viết mà người đó đã viết, bạn có thể sử dụng population để lấy thông tin về các bài viết đó từ bộ sưu tập bài viết.
JWT (JSON Web Token) là một loại token được sử dụng để xác thực và truyền tải thông tin giữa các ứng dụng web. Nó được tạo ra bằng cách sử dụng một khóa bí mật và được ký bằng một thuật toán mật mã. JWT thường được sử dụng trong các ứng dụng web yêu cầu xác thực và bảo mật cao. Ví dụ, khi bạn đăng nhập vào một ứng dụng web, ứng dụng đó sẽ tạo ra một JWT và gửi nó đến máy chủ để xác thực. Máy chủ sẽ kiểm tra JWT và nếu nó hợp lệ, sẽ trả về thông tin cần thiết cho ứng dụng web. JWT có thể được sử dụng để truyền tải thông tin như tên người dùng, email, v.v. Nó giúp ứng dụng web xác thực và bảo mật thông tin một cách hiệu quả.
Để định nghĩa một schema trong Mongoose, chúng ta sử dụng phương thức mongoose.Schema(). Phương thức này cho phép chúng ta tạo một đối tượng schema mới, sau đó sử dụng nó để tạo các model trong cơ sở dữ liệu. Ví dụ, nếu chúng ta muốn tạo một model cho một bảng trong cơ sở dữ liệu, chúng ta sẽ sử dụng mongoose.Schema() để tạo một đối tượng schema, sau đó sử dụng phương thức model() của Mongoose để tạo model từ đối tượng schema đó. Phương thức mongoose.Schema() rất quan trọng trong Mongoose vì nó cho phép chúng ta định nghĩa cấu trúc dữ liệu của cơ sở dữ liệu.
Trạng thái HTTP 401 là một mã trạng thái HTTP được sử dụng để chỉ định rằng một yêu cầu đã được gửi đến một nguồn tài nguyên mà người dùng không có quyền truy cập. Điều này có thể xảy ra khi người dùng nhập sai thông tin đăng nhập hoặc khi người dùng không có quyền truy cập vào tài nguyên đó. Mã trạng thái này thường được sử dụng trong các ứng dụng yêu cầu xác thực để chỉ định rằng người dùng không được phép truy cập vào tài nguyên đó. Ví dụ, khi người dùng nhập sai mật khẩu hoặc tên người dùng, ứng dụng có thể trả về mã trạng thái 401 để chỉ định rằng người dùng không được phép truy cập vào tài nguyên đó.
Để bảo mật mật khẩu người dùng trong cơ sở dữ liệu, một thói quen tốt là sử dụng phương pháp hashing và muối trước khi lưu trữ. Hashing là quá trình biến đổi mật khẩu thành một chuỗi ký tự ngẫu nhiên, không thể khôi phục lại mật khẩu ban đầu. Muối (salt) là một chuỗi ký tự ngẫu nhiên được thêm vào mật khẩu trước khi hashing, giúp ngăn chặn các cuộc tấn công sử dụng các công cụ cracking mật khẩu. Phương pháp này giúp bảo vệ cơ sở dữ liệu khỏi các cuộc tấn công từ xa và bảo vệ thông tin người dùng. Ngoài ra, việc sử dụng hashing và muối cũng giúp giảm thiểu rủi ro bị lộ mật khẩu trong trường hợp cơ sở dữ liệu bị xâm phạm.
Trong Express, đối tượng được sử dụng để gửi dữ liệu trở lại cho client là 'res'. Đối tượng này là một phần của đối tượng request, được sử dụng để trả về dữ liệu cho client. Đối tượng res cung cấp các phương thức để trả về dữ liệu, chẳng hạn như send(), json(), redirect() v.v. Nó cũng cung cấp các phương thức để điều chỉnh trạng thái HTTP, chẳng hạn như statusCode(). Đối tượng res là một phần quan trọng của Express và được sử dụng rộng rãi trong việc phát triển các ứng dụng web.
RESTful APIs (Application Programming Interfaces) là một phương thức giao tiếp giữa các ứng dụng hoặc hệ thống. Lợi ích chính của việc sử dụng RESTful APIs là sự nhất quán và khả năng mở rộng. Điều này có nghĩa là các ứng dụng hoặc hệ thống có thể giao tiếp với nhau một cách dễ dàng và hiệu quả, bất kể họ được xây dựng trên nền tảng nào. Sự nhất quán và khả năng mở rộng của RESTful APIs cho phép các ứng dụng hoặc hệ thống được thiết kế để hoạt động cùng nhau một cách trơn tru, giảm thiểu thời gian và công sức cần thiết để tích hợp và duy trì chúng. Điều này đặc biệt quan trọng trong các hệ thống lớn và phức tạp, nơi sự nhất quán và khả năng mở rộng là cần thiết để đảm bảo hiệu suất và độ tin cậy.
AThe http.createServer method is used to create a server instance.
BThe server.listen method is used to start the server and listen for incoming requests.
CThe require('http') statement is used to install the http module.
DThe npm i http command is used to require the http module in your code.
Lời giải
Để tạo và bắt đầu một máy chủ HTTP trong Node.js, bạn cần sử dụng các phương thức và lệnh cụ thể. Đầu tiên, bạn cần tạo một đối tượng máy chủ bằng cách sử dụng phương thức http.createServer(). Phương thức này sẽ tạo một máy chủ mới và cho phép bạn cấu hình các thuộc tính và hành vi của nó. Sau đó, bạn cần sử dụng phương thức server.listen() để bắt đầu máy chủ và chờ đợi các yêu cầu từ khách hàng. Phương thức này sẽ giúp máy chủ lắng nghe trên một cổng cụ thể và xử lý các yêu cầu khi chúng đến. Ngoài ra, bạn cần sử dụng lệnh require('http') để nhập mô-đun http vào mã của bạn. Điều này sẽ cho phép bạn truy cập vào các phương thức và thuộc tính của mô-đun http.
CSRF (Cross-Site Request Forgery) là một loại tấn công web phổ biến. Nó xảy ra khi một kẻ tấn công lừa người dùng thực hiện một yêu cầu trên một trang web mà người dùng tin tưởng, mà không có ý thức. Kẻ tấn công thường sử dụng các kỹ thuật như gửi email hoặc tạo trang web giả mạo để lừa người dùng nhấp vào một liên kết hoặc gửi một yêu cầu. Khi người dùng thực hiện yêu cầu đó, kẻ tấn công có thể thực hiện các hành động không mong muốn trên tài khoản người dùng, chẳng hạn như gửi email hoặc thực hiện giao dịch tài chính.
Câu hỏi này yêu cầu bạn xác định cách sử dụng hợp lệ của phương thức populate() trong Mongoose. Populate() là một phương thức được sử dụng để tải dữ liệu từ các mô hình liên quan. Để sử dụng populate() một cách hợp lệ, bạn cần sử dụng nó với phương thức find() để tìm kiếm dữ liệu và tải dữ liệu liên quan.
Node.js là một môi trường chạy (runtime) cho JavaScript trên máy chủ. Nó cho phép các nhà phát triển sử dụng JavaScript để tạo ra các ứng dụng web và mạng máy tính. Node.js sử dụng mô hình non-blocking I/O, cho phép các ứng dụng xử lý nhiều yêu cầu đồng thời mà không cần chờ đợi nhau. Điều này làm cho Node.js trở thành một lựa chọn phổ biến cho các ứng dụng cần xử lý nhiều yêu cầu đồng thời, như các ứng dụng mạng xã hội, các trang web động và các ứng dụng thời gian thực.
AsetImmediate() schedules the callback function to run immediately after the current event loop iteration, regardless of the delay specified.
BsetTimeout() schedules the callback function to run after a specified delay, which can be zero (i.e., immediately) or a positive integer representing the number of milliseconds to wait.
CIf both setTimeout() and setImmediate() are called in the same loop iteration, setTimeout() will be executed before setImmediate().
DNone of the above
Lời giải
Câu hỏi này yêu cầu bạn xác định tuyên bố sai về sự khác biệt giữa setImmediate() và setTimeout(). Câu trả lời đúng là: 'Nếu cả setTimeout() và setImmediate() được gọi trong cùng một vòng lặp, setTimeout() sẽ được thực hiện trước setImmediate()'. Điều này sai vì thực tế setImmediate() sẽ được thực hiện trước setTimeout() khi cả hai được gọi trong cùng một vòng lặp. SetImmediate() được thiết kế để chạy ngay lập tức sau vòng lặp hiện tại, trong khi setTimeout() sẽ chờ đợi cho đến khi hết thời gian chờ đợi. Điều này có thể được minh họa qua ví dụ sau:
Lời giải
var i =0;setImmediate(function(){ console.log('Immediate', i); i++;});setTimeout(function(){ console.log('Timeout', i); i++;},0);
Kết quả sẽ là:
Immediate 0
Timeout 2
Như vậy, setImmediate() được thực hiện trước setTimeout() khi cả hai được gọi trong cùng một vòng lặp.
ACallbacks can only be used with setTimeout and setInterval.
BCallbacks are functions passed as arguments to other functions.
CCallbacks are executed immediately after being defined.
DCallbacks are used to handle asynchronous operations.
Lời giải
Callbacks trong Node.js là các hàm được gọi lại sau khi một hành động được thực hiện. Họ thường được sử dụng để xử lý các hoạt động bất đồng bộ. Ví dụ, khi chúng ta muốn đọc một file, Node.js sẽ không chờ đợi cho đến khi file được đọc xong mà sẽ tiếp tục thực hiện các hành động khác. Khi file được đọc xong, Node.js sẽ gọi lại hàm callback để xử lý dữ liệu. Các hàm callback có thể được gọi lại nhiều lần và có thể được sử dụng để xử lý các hoạt động như đọc file, gửi yêu cầu HTTP, v.v. Họ cũng có thể được sử dụng để xử lý các lỗi xảy ra trong quá trình thực hiện các hành động.
BTo issue tokens to clients after successfully authenticating the resource owner
CTo store user credentials
DTo provide an interface for user registration
Lời giải
Trong khuôn khổ khung thức OAuth 2.0, vai trò của 'Authorization Server' là xác thực người dùng và cấp phát token cho các ứng dụng khách sau khi người dùng đã được xác thực thành công. Authorization Server đóng vai trò là một trung gian giữa người dùng và ứng dụng khách, giúp đảm bảo rằng người dùng đã được phép truy cập vào tài nguyên mà họ yêu cầu. Quá trình này bao gồm việc người dùng được yêu cầu nhập thông tin xác thực, sau đó Authorization Server sẽ xác thực thông tin đó và cấp phát token cho ứng dụng khách. Token này sẽ được sử dụng để truy cập vào tài nguyên mà người dùng đã được phép.
SSL (Secure Sockets Layer) và TLS (Transport Layer Security) đều là các giao thức được sử dụng để đảm bảo giao tiếp an toàn trên web. SSL được phát triển ban đầu và được sử dụng rộng rãi trong những năm 1990, nhưng nó đã bị thay thế bởi TLS vào những năm 2000 do các vấn đề về bảo mật. TLS cung cấp các tính năng bảo mật mạnh mẽ hơn và khả năng tương thích rộng hơn so với SSL. Vì vậy, cả SSL và TLS đều được sử dụng để đảm bảo giao tiếp an toàn trên web.
Để thiết lập server Express của bạn để chấp nhận tải lên file, bạn cần sử dụng module nào? Module nào dưới đây được sử dụng để thiết lập server Express để chấp nhận tải lên file?