Top.Mail.Ru

Связываем Vue.js и Node.js: Пишем простое полноценное приложение с нуля

Связываем Vue.js и Node.js: Пишем простое полноценное приложение с нуля

Приветствую всех, кто интересуется веб-разработкой! Сегодня мы разберем одну из фундаментальных задач: создание полноценного приложения, где клиентская часть на Vue.js общается с сервером на Node.js. Это основа, на которой строятся бесчисленные современные веб-приложения.

Мы не будем углубляться в сложные архитектуры и используем самые простые инструменты. Наша цель — понять принцип взаимодействия.

Что мы построим?
Создадим простое приложение «Список задач». Клиент на Vue будет отображать список дел, добавлять новые и удалять старые. Сервер на Node.js будет хранить этот список (пока что в памяти) и обрабатывать все запросы от клиента.

Технологический стек:

  • Бэкенд: Node.js + Express

  • Фронтенд: Vue.js

  • Связь: HTTP-запросы (GET, POST, DELETE)

Настраиваем сервер (Node.js + Express)

Сервер будет нашим «мозговым центром». Он будет слушать запросы и отправлять данные в формате JSON.

Создайте новую папку для проекта, например vue-node-demo, а внутри нее папку server. Откройте терминал в server и выполните: npm init -y npm install express cors express — это фреймворк для создания сервера, а cors позволит нашему Vue-клиенту с другого порта беспрепятственно общаться с сервером.

Пишем код сервера (server/index.js):

Создайте файл index.js и напишите в нем следующий код:

// Импортируем необходимые модули
const express = require('express');
const cors = require('cors');

// Создаем экземпляр приложения Express
const app = express();
const PORT = 5000; // Порт, на котором будет работать наш сервер

// Подключаем middleware
app.use(cors()); // Разрешаем запросы с любого origin (для разработки)
app.use(express.json()); // Позволяет серверу читать JSON из тела запроса

// Наш "массив в памяти" будет служить базой данных
let tasks = [
  { id: 1, text: 'Изучить Vue.js' },
  { id: 2, text: 'Написать простой сервер на Node.js' },
];

// Маршруты API

// GET /api/tasks - Получить все задачи
app.get('/api/tasks', (req, res) => {
  res.json(tasks);
});

// POST /api/tasks - Добавить новую задачу
app.post('/api/tasks', (req, res) => {
  const newTask = {
    id: tasks.length + 1, // Простейший способ генерации ID
    text: req.body.text, // Текст задачи берем из тела запроса
  };
  tasks.push(newTask);
  res.status(201).json(newTask); // Возвращаем созданную задачу со статусом 201 (Created)
});

// DELETE /api/tasks/:id - Удалить задачу по ID
app.delete('/api/tasks/:id', (req, res) => {
  const taskId = parseInt(req.params.id);
  tasks = tasks.filter(task => task.id !== taskId);
  res.status(204).send(); // Возвращаем статус 204 (No Content) - успешно, но без тела
});

// Запускаем сервер
app.listen(PORT, () => {
  console.log(`Сервер запущен на http://localhost:${PORT}`);
});

В терминале выполните: node index.js

Вы должны увидеть сообщение: Сервер запущен на http://localhost:5000.

Поздравляем, ваш API готов! Вы можете проверить его работу в Postman или просто перейдя по адресу http://localhost:5000/api/tasks в браузере.

Создаем клиент (Vue.js)

Теперь создадим интерфейс, который будет взаимодействовать с нашим сервером.

Создаем Vue-приложение:
Откройте новый терминал в корне проекта (vue-node-demo) и выполните: npm create vue@latest client

На вопрос Add TypeScript? -> No

Add JSX Support? -> No

Add Vue Router for Single Page Application? -> No

Остальные опции также можно выбрать No для простоты.

 

cd client
npm install
npm install axios

axios — популярная библиотека для удобной работы с HTTP-запросами.

Модифицируем компонент (client/src/App.vue):
Заменим содержимое App.vue на следующее:

<template>
  <div id="app">
    <h1>Мой список задач</h1>
    <div class="task-form">
      <input v-model="newTaskText" @keyup.enter="addTask" placeholder="Введите новую задачу...">
      <button @click="addTask">Добавить</button>
    </div>
    <ul class="task-list">
      <li v-for="task in tasks" :key="task.id" class="task-item">
        <span>{{ task.text }}</span>
        <button @click="deleteTask(task.id)" class="delete-btn">Удалить</button>
      </li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios';

// Создаем экземпляр axios с базовым URL нашего сервера
const apiClient = axios.create({
  baseURL: 'http://localhost:5000/api',
});

export default {
  name: 'App',
  data() {
    return {
      tasks: [], // Здесь будем хранить список задач
      newTaskText: '' // Текст для новой задачи
    };
  },
  // Когда компонент создан, загружаем задачи с сервера
  async created() {
    await this.fetchTasks();
  },
  methods: {
    // Метод для получения задач с сервера
    async fetchTasks() {
      try {
        const response = await apiClient.get('/tasks');
        this.tasks = response.data;
      } catch (error) {
        console.error('Ошибка при загрузке задач:', error);
      }
    },
    // Метод для добавления новой задачи
    async addTask() {
      if (this.newTaskText.trim() === '') return; // Не добавляем пустые задачи

      try {
        await apiClient.post('/tasks', { text: this.newTaskText });
        this.newTaskText = ''; // Очищаем поле ввода
        await this.fetchTasks(); // Обновляем список после добавления
      } catch (error) {
        console.error('Ошибка при добавлении задачи:', error);
      }
    },
    // Метод для удаления задачи
    async deleteTask(taskId) {
      try {
        await apiClient.delete(`/tasks/${taskId}`);
        await this.fetchTasks(); // Обновляем список после удаления
      } catch (error) {
        console.error('Ошибка при удалении задачи:', error);
      }
    }
  }
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  max-width: 600px;
  margin: 50px auto;
}
.task-form {
  margin-bottom: 20px;
}
input {
  padding: 10px;
  width: 70%;
  margin-right: 10px;
}
button {
  padding: 10px 15px;
  cursor: pointer;
}
.task-list {
  list-style: none;
  padding: 0;
}
.task-item {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 10px;
  border-bottom: 1px solid #eee;
}
.delete-btn {
  background-color: #ff4444;
  color: white;
  border: none;
}
</style>


Убедитесь, что сервер все еще работает на localhost:5000. Затем в терминале в папке client выполните:

npm run dev

Vue сообщит вам адрес (скорее всего, http://localhost:5173). Перейдите по нему.

Автор:

4

Читайте также

0 комментариев

Оставьте комментарий

Комментарии

×
Подпишитесь на наш Telegram-канал, чтобы быть в курсе всех новостей и акций!
Подписаться