Menu
CoddyTech

Chuỗi truy vấn

Thuộc phần Kiến thức cơ bản về Express trong hành trình Node.js của Coddy. Bài học 5 trên 23.

Trang danh sách thường cần các tùy chọn, chẳng hạn như chọn công thức nào sẽ hiển thị, và tạo một tuyến mới cho mỗi tùy chọn thì sẽ quá nhiều.

app.get('/books', (req, res) => {
    const { author } = req.query;
    res.send(author ? 'Books by ' + author : 'All books');
});

Chuỗi truy vấn (query string) là phần của URL nằm sau ?, và Express đặt nó trong req.query, một đối tượng. const { author } = req.query là cách viết ngắn gọn của const author = req.query.author. GET /books?author=Austen cho kết quả req.query.author === 'Austen'. Nếu không có ?, giá trị sẽ là undefined. Có thể nối nhiều tùy chọn bằng &: /books?author=Austen&year=1813.

Tham số tuyến là một phần của đường dẫn và chỉ một đối tượng cụ thể. Tùy chọn truy vấn dùng để lọc hoặc sắp xếp danh sách, và có thể bỏ qua.

challenge icon

Thử thách

Dễ

Khách truy cập muốn chỉ xem công thức món chay hoặc chỉ xem món ăn tối mà không cần tạo trang mới cho từng thẻ.

  1. Trong server.js, thay đổi tuyến /recipes. Đọc tùy chọn tag từ chuỗi truy vấn. Mỗi công thức trong data.js có danh sách tags, chẳng hạn ['vegan', 'soup'].
  2. Khi có thẻ, chỉ gửi tiêu đề của những công thức có thẻ đó trong tags, mỗi tiêu đề trên một dòng, như tuyến này đang làm.
  3. Khi không có thẻ, gửi tất cả tiêu đề như trước.
  4. Khi không có công thức nào có thẻ đó, gửi phản hồi trống với trạng thái 200.

Thử nhé: Nhấn Chạy rồi gửi /recipes?tag=vegan. Bạn sẽ thấy hai dòng: Tomato Soup và Lentil Curry. Gửi /recipes?tag=dinner: Lentil Curry và Fish & Chips. Gửi /recipes?tag=dessert: phản hồi trống vì không có công thức nào có thẻ đó. Gửi /recipes: cả bốn tiêu đề.

Tự làm thử

import express from 'express';
import { recipes } from './data.js';

const app = express();

app.get('/', (req, res) => {
    res.send('Welcome to Recipe Box');
});

// type('text') gửi văn bản thuần, nên mỗi tiêu đề hiển thị trên một dòng riêng.
app.get('/recipes', (req, res) => {
    res.type('text').send(recipes.map((recipe) => recipe.title).join('\n'));
});

app.get('/recipes/:id', (req, res) => {
    const recipe = recipes.find((r) => r.id === Number(req.params.id));
    if (!recipe) {
        res.status(404).send('No such recipe');
        return;
    }
    res.send(recipe.title);
});

app.get('/about', (req, res) => {
    res.send('Recipe Box collects family recipes.');
});

app.listen(3000, () => {
    console.log('Recipe Box is running on port 3000');
});

Tất cả bài học trong Kiến thức cơ bản về Express

Tự luyện tập: Playground Express