Задать вопрос
@korablev_art

Docker, Laravel, Vue — The POST method is not supported for route api/tasks/$%7Bid%7D. Supported methods: PUT, DELETE?

Я пишу простой пет-проект на Laravel 10 + Vue 3. Написал проект, он отлично работает, затем создал Docker-контейнеры. Серверная часть проекта работает нормально (всё проверил через Postman), но во фронтенд-части возникает ошибка при попытке обновить/удалить задачу (с созданием и просмотром всё в порядке). Ошибка возникает только при обновлении/удалении задачи: метод POST не поддерживается для маршрута api/tasks/$%7Bid%7D. Поддерживаемые методы: PUT, DELETE.

default.conf (используется для nginx в docker), думаю проблема в нем.
server {
listen 80;
server_name localhost;

root /var/www/frontend/dist;
index index.html;

location / {
try_files $uri $uri/ /index.html;
}

location /api {
try_files $uri /index.php$is_args$args;
}

location ~ ^/index\.php(/|$) {
fastcgi_pass app:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/backend/public/index.php;
fastcgi_param DOCUMENT_ROOT /var/www/backend/public;
internal;
}

error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
}


Также приведу taskStore.js, которое используется в Vue
import { defineStore } from 'pinia'
import api from '@/api'

export const useTaskStore = defineStore('task', {
  state: () => ({
    tasks: [],
    loading: false,
    error: null,
    lastRequestTime: null,
    useMethodOverride: false
  }),

  getters: {
    hasError: (state) => state.error !== null,
    isLoading: (state) => state.loading,
    getTaskById: (state) => (id) => state.tasks.find(task => task.id === Number(id))
  },

  actions: {
    async _executeRequest(method, url, data = null, errorMessage) {
      this.loading = true
      this.error = null

      try {
        let response
        
        if (this.useMethodOverride && ['PUT', 'DELETE', 'PATCH'].includes(method)) {
          response = await api.post(url, { ...data, _method: method })
        } else {
          switch (method) {
            case 'GET': response = await api.get(url); break
            case 'POST': response = await api.post(url, data); break
            case 'PUT': response = await api.put(url, data); break
            case 'DELETE': response = await api.delete(url, data); break
            default: throw new Error(`Unsupported method: ${method}`)
          }
        }

        this.lastRequestTime = new Date()
        return response.data
      } catch (err) {
        this.error = err.response?.data?.message || errorMessage || `Request failed: ${err.message}`
        throw err
      } finally {
        this.loading = false
      }
    },

    async fetchTasks() {
      const data = await this._executeRequest('GET', '/tasks', null, 'Ошибка при загрузке задач')
      this.tasks = data
      return data
    },

    /**
     * Создание новой задачи
     */
    async createTask(taskData) {
      const data = await this._executeRequest('POST', '/tasks', taskData, 'Ошибка при создании задачи')
      this.tasks.push(data)
      return data
    },

    /**
     * Обновление задачи
     */
    async updateTask(id, taskData) {
      const taskId = Number(id)
      const data = await this._executeRequest(
        'PUT', 
        `/tasks/${taskId}`, 
        taskData, 
        'Ошибка при обновлении задачи'
      )
      
      const index = this.tasks.findIndex(task => task.id === taskId)
      if (index !== -1) this.tasks[index] = data
      return data
    },

    /**
     * Удаление задачи
     */
    async deleteTask(id) {
      const taskId = Number(id)
      if (isNaN(taskId)) throw new Error(`Некорректный ID задачи: ${id}`)
      
      await this._executeRequest('DELETE', `/tasks/${taskId}`, null, 'Ошибка при удалении задачи')
      this.tasks = this.tasks.filter(task => task.id !== taskId)
      return true
    },

    setMethodOverride(enabled) {
      this.useMethodOverride = enabled
    },

    clearError() {
      this.error = null
    }
  }
})


Перепробовал всё, что мог, сам новичок, имею относительно небольшой опыт
  • Вопрос задан
  • 59 просмотров
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы