You are a helpful assistant.
system
Viết ứng dụng Node.js lắng nghe các yêu cầu HTTP đến trên cổng 3000, phản hồi theo thời gian hiện tại của máy chủ ở định dạng ISO, xử lý các phương thức HTTP khác nhau, và phục vụ các tệp tĩnh từ một thư mục chỉ định, đồng thời tích hợp cơ chế xử lý lỗi và middleware.
user
Để viết một ứng dụng Node.js như bạn yêu cầu, chúng ta có thể sử dụng framework Express.js để dễ dàng quản lý các yêu cầu HTTP, xử lý middleware, và phục vụ các tệp tĩnh. Dưới đây là một ví dụ cơ bản về cách thực hiện điều này:

```javascript
const express = require('express');
const path = require('path');

const app = express();
const PORT = 3000;

// Middleware để log thông tin về các yêu cầu
app.use((req, res, next) => {
  console.log(`${req.method} ${req.url}`);
  next();
});

// Middleware để phục vụ các tệp tĩnh từ thư mục 'public'
app.use(express.static(path.join(__dirname, 'public')));

// Xử lý yêu cầu GET đến root
app.get('/', (req, res) => {
  res.send('Chào mừng bạn đến với ứng dụng Node.js!');
});

// Xử lý yêu cầu GET đến /time để trả về thời gian hiện tại
app.get('/time', (req, res) => {
  const currentTime = new Date().toISOString();
  res.send(`Thời gian hiện tại là: ${currentTime}`);
});

// Xử lý yêu cầu POST
app.post('/', (req, res) => {
  res.send('Đã nhận được yêu cầu POST');
});

// Xử lý yêu cầu PUT
app.put('/', (req, res) => {
  res.send('Đã nhận được yêu cầu PUT');
});

// Xử lý yêu cầu DELETE
app.delete('/', (req, res) => {
  res.send('Đã nhận được yêu cầu DELETE');
});

// Middleware xử lý lỗi
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('Đã xảy ra lỗi!');
});

// Khởi động máy chủ
app.listen(PORT, () => {
  console.log(`Máy chủ đang lắng nghe trên cổng ${PORT}`);
});
```

### Giải thích:

1. **Express.js**: Đây là một framework phổ biến cho Node.js giúp dễ dàng quản lý các tuyến đường (routes) và middleware.

2. **Middleware**: Được sử dụng để log thông tin về các yêu cầu và xử lý lỗi.

3. **Static Files**: Sử dụng `express.static` để phục vụ các tệp tĩnh từ thư mục `public`. Bạn cần tạo thư mục này và đặt các tệp tĩnh (như HTML, CSS, JS) vào đó.

4. **Routes**: Định nghĩa các tuyến đường cho các phương thức HTTP khác nhau như GET, POST, PUT, DELETE.

5. **Error Handling**: Middleware cuối cùng để xử lý lỗi, đảm bảo rằng bất kỳ lỗi nào xảy ra trong ứng dụng đều được log và phản hồi một cách thích hợp.

Bạn có thể mở rộng ứng dụng này bằng cách thêm nhiều tuyến đường và middleware hơn tùy theo nhu cầu của bạn.
assistant