Tổng hợp 40 câu hỏi phỏng vấn GraphQL kèm đáp án chi tiết, song ngữ Việt–Anh — sắp xếp từ cơ bản đến nâng cao. Ôn luyện miễn phí, tự động lưu tiến độ.
GraphQL là ngôn ngữ truy vấn cho API, trong đó client mô tả chính xác dữ liệu mình cần và server trả về đúng shape đó. REST thì mỗi endpoint có response shape cố định, nên client hoặc bị over-fetching, hoặc phải gọi nhiều lần…
Schema là contract mô tả mọi kiểu, field và tham số mà client truy vấn được. Cả hai phía dựa vào nó, nên truy vấn sai tên field hay sai kiểu bị từ chối trước khi thực thi, và mọi công cụ codegen, autocomplete trong…
Query là đọc, Mutation là ghi, Subscription là luồng dữ liệu server đẩy về. Về mặt thực thi có một khác biệt quan trọng: các top-level field của mutation chạy tuần tự để thứ tự thay đổi dữ liệu là xác định, còn các field…
Resolver là hàm trả về giá trị cho một field. Server đi theo shape truy vấn và gọi resolver tương ứng cho từng field, nên một truy vấn lồng nhiều tầng kích hoạt cả một cây lời gọi. Mỗi resolver nhận bốn thứ: giá trị…
Dấu chấm than nghĩa là field không bao giờ trả về null. Đây là cam kết mạnh: nếu resolver trả về null cho field đó, lỗi sẽ lan lên field cha gần nhất cho phép null, và có thể xoá cả một nhánh dữ liệu…
Dùng biến thì query document giữ nguyên shape cho mọi giá trị, nên server phân tích và cache được, còn giá trị được kiểm tra kiểu theo schema. Ghép chuỗi tạo ra một truy vấn khác nhau mỗi lần và cho phép người dùng ảnh…
Fragment gom một nhóm field dùng lại được. Trong thực tế, mỗi component tự khai báo dữ liệu mình cần, rồi màn hình ghép các fragment lại thành một truy vấn duy nhất. Đây là pattern quan trọng khi ứng dụng lớn dần: sửa một…
Có. Phản hồi gồm phần data và mảng errors, nên một truy vấn có thể trả về partial result: nhánh nào lỗi thì null và được ghi vào mảng errors, nhánh khác vẫn có dữ liệu. Hệ quả cho client: không thể chỉ nhìn HTTP…
Truy vấn danh sách 50 bài viết kèm tác giả sinh ra 51 lời gọi database: một lời gọi lấy danh sách, rồi resolver của field tác giả chạy riêng cho từng bài. Cách xử lý chuẩn là DataLoader: hoãn các yêu cầu lẻ trong…
Nó nhận diện object bằng typename + id của record. Nhờ vậy cùng một object xuất hiện trong nhiều truy vấn chỉ được lưu một bản, và cập nhật nó ở một nơi tự phản ánh ở mọi màn hình đang hiển thị. Điều kiện:…
Cursor trỏ vào một vị trí xác định trong tập kết quả, nên record mới chèn vào không làm lệch trang như phân trang theo số trang. Đổi lại, nhảy thẳng tới trang thứ mười là việc khó. Quy ước phổ biến là Connection pattern:…
Đặt ở business logic phía sau resolver, nơi biết cả người dùng lẫn record cụ thể. Kiểm tra chỉ ở gateway là chưa đủ vì nó chỉ biết người dùng là ai, không biết họ có quyền xem đúng record đang yêu cầu hay không.…
Vì client tự quyết định shape truy vấn, một truy vấn lồng sâu qua quan hệ hai chiều có thể tăng khối lượng theo cấp số nhân và làm quá tải server chỉ với một yêu cầu. Ví dụ kinh điển: bài viết có tác…
Persisted query tự động cho phép server học truy vấn mới khi gặp lần đầu, sau đó client chỉ gửi hash. Mục đích chính là giảm dung lượng gửi lên. Allowlist thì server chỉ chấp nhận các truy vấn đã đăng ký lúc build và…
Trả về record vừa thay đổi kèm các field liên quan, để client cập nhật cache và giao diện ngay. Với normalized cache, chỉ cần id và các field đã đổi là mọi màn hình tự cập nhật. Mẫu phổ biến là một kiểu trả…
GraphQL tiến hoá bằng cách thêm field mới và đánh dấu field cũ là không dùng nữa. Client cũ vẫn chạy vì field cũ còn đó, và field cũ chỉ bị gỡ khi không còn ai truy vấn tới. Điều kiện để cách này hoạt…
Vì mọi truy vấn đi qua một địa chỉ duy nhất và thường dùng POST, nên cache trung gian không phân biệt được các truy vấn khác nhau. Bù lại, GraphQL đẩy việc cache về phía client với normalized cache theo object. Cách lấy lại…
Codegen tạo ra kiểu chính xác cho từng truy vấn, nên gõ sai tên field hay dùng sai kiểu bị bắt lúc biên dịch. Kết hợp với kiểm tra schema trong CI, một breaking change sẽ làm hỏng build thay vì hỏng ứng dụng của…
Subscription hợp với sự kiện không đoán trước và cần đẩy ngay: tin nhắn mới, giá thay đổi, trạng thái đơn hàng. Với dữ liệu đổi đều đặn, hỏi lại theo lịch thường đơn giản và rẻ hơn nhiều. Chi phí vận hành hay bị…
Interface buộc mọi kiểu cài đặt nó phải có chung một tập field, nên truy vấn được các field đó mà không cần biết kiểu cụ thể. Union gom các kiểu không có gì chung, nên phải dùng fragment theo từng kiểu. Chọn theo ngữ…
Custom scalar cho phép kiểm tra và chuẩn hoá định dạng ngay ở tầng schema: giá trị sai bị từ chối trước khi vào resolver, và mọi client nhận cùng một định dạng. Các kiểu hay dùng: ngày giờ, email, URL, số thập phân chính…
Chúng bật tắt một phần truy vấn theo giá trị biến, nên cùng một document phục vụ được nhiều trường hợp. Điều này quan trọng với persisted query, vì ở đó số document khác nhau cần giữ ở mức tối thiểu. Directive chia hai nhóm:…
Schema lo phần kiểu và tính bắt buộc, còn luật nghiệp vụ nằm ở business logic. Hệ kiểu không diễn tả được các luật như số tiền phải dương, mã giảm giá còn hiệu lực, hay ngày kết thúc phải sau ngày bắt đầu. Cách…
Tính theo chi phí ước lượng của truy vấn, không phải số yêu cầu. Một truy vấn lấy một record và một truy vấn lồng ba tầng qua danh sách nghìn phần tử là hai khối lượng công việc chênh nhau hàng nghìn lần. Cách…
Schema-first: viết schema bằng SDL rồi cài đặt resolver theo nó. Code-first: định nghĩa kiểu bằng mã và schema được sinh ra. Khác biệt thật nằm ở chỗ đâu là source of truth của contract và cách các đội phối hợp. Schema trước hợp khi…
Đặt ở state của ứng dụng chứ không nhét vào cache GraphQL. Cache được thiết kế cho dữ liệu server với cơ chế làm mới và hết hạn riêng, còn trạng thái giao diện có vòng đời hoàn toàn khác. Ranh giới nên giữ: dữ…
Đo theo tên truy vấn và theo thời gian resolve từng field. Đo ở mức endpoint là vô nghĩa vì mọi truy vấn dùng chung một địa chỉ, và status code thường là 200 kể cả khi phản hồi chứa lỗi. Các số liệu đáng…
Chạy truy vấn thật qua schema rồi so kết quả, vì cách này phủ cả schema, resolver và business logic đúng như client sẽ gặp. Data source bên dưới thì giả lập để test nhanh và ổn định. Các trường hợp nên phủ ngoài happy…
Cách chắc chắn nhất là xin presigned URL qua một mutation, tải tệp thẳng lên kho lưu trữ, rồi gọi mutation thứ hai để gắn tệp vào record. Tệp không đi qua server API nên tránh được giới hạn kích thước và tải nặng. Đặc…
Dùng GET khi kết hợp với persisted query: địa chỉ trở nên duy nhất theo hash và biến, nên CDN và proxy trung gian cache được. Với truy vấn dài viết thẳng thì POST an toàn hơn vì không vướng giới hạn độ dài địa…