You are a helpful assistant.
system
Phát triển một tập lệnh Node.js để tìm nạp thông tin thời tiết hiện tại cho một thành phố nhất định bằng API OpenWeatherMap, đảm bảo rằng tập lệnh này hoạt động hiệu quả trong vòng 5 giây và hiển thị thông tin ở định dạng JSON dễ đọc, bao gồm nhiệt độ, độ ẩm, tốc độ gió và mô tả thời tiết ngắn gọn, đồng thời xử lý các lỗi như tên thành phố không hợp lệ hoặc sự cố API, với khả năng mở rộng cho các API khác trong tương lai.
user
Để phát triển một tập lệnh Node.js có thể tìm nạp thông tin thời tiết hiện tại từ API OpenWeatherMap, bạn cần thực hiện các bước sau:

1. **Đăng ký API Key**: Trước tiên, bạn cần đăng ký một tài khoản trên OpenWeatherMap và lấy API Key.

2. **Cài đặt Node.js và các thư viện cần thiết**: Đảm bảo rằng bạn đã cài đặt Node.js. Sau đó, bạn có thể sử dụng `npm` để cài đặt thư viện `axios` để thực hiện các yêu cầu HTTP.

3. **Viết tập lệnh Node.js**: Tập lệnh sẽ gửi yêu cầu đến API OpenWeatherMap và xử lý phản hồi.

Dưới đây là một ví dụ về tập lệnh Node.js:

```javascript
const axios = require('axios');

// Thay thế 'YOUR_API_KEY' bằng API Key của bạn
const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'http://api.openweathermap.org/data/2.5/weather';

async function getWeather(city) {
    try {
        const response = await axios.get(BASE_URL, {
            params: {
                q: city,
                appid: API_KEY,
                units: 'metric' // Để lấy nhiệt độ theo độ C
            },
            timeout: 5000 // Giới hạn thời gian chờ là 5 giây
        });

        const data = response.data;
        const weatherInfo = {
            temperature: data.main.temp,
            humidity: data.main.humidity,
            windSpeed: data.wind.speed,
            description: data.weather[0].description
        };

        console.log(JSON.stringify(weatherInfo, null, 2));
    } catch (error) {
        if (error.response) {
            // Lỗi từ phía server (ví dụ: thành phố không tồn tại)
            console.error(`Error: ${error.response.data.message}`);
        } else if (error.request) {
            // Không nhận được phản hồi
            console.error('Error: No response received from the server.');
        } else {
            // Lỗi khác
            console.error(`Error: ${error.message}`);
        }
    }
}

// Thay thế 'Hanoi' bằng tên thành phố bạn muốn tìm kiếm
getWeather('Hanoi');
```

**Giải thích:**

- **axios**: Thư viện này được sử dụng để thực hiện các yêu cầu HTTP.
- **BASE_URL**: URL cơ bản của API OpenWeatherMap.
- **getWeather**: Hàm này gửi yêu cầu đến API với tên thành phố và API Key. Nó cũng thiết lập đơn vị nhiệt độ là độ C.
- **timeout**: Đảm bảo rằng yêu cầu không kéo dài quá 5 giây.
- **Xử lý lỗi**: Tập lệnh xử lý các lỗi có thể xảy ra, bao gồm lỗi từ phía server (như tên thành phố không hợp lệ) và lỗi không nhận được phản hồi.

Bạn có thể mở rộng tập lệnh này để hỗ trợ các API khác bằng cách tạo các hàm tương tự cho từng API và sử dụng các tham số cấu hình để chuyển đổi giữa các API.
assistant