Я пытаюсь сделать простую загрузку файла в приложении Vue с помощью API fetch.
На сервере есть простой express.js
сервер, прослушивающий маршрут. Я использую прокси для бэкэнда в приложении Vue.
vue.config.js
module.exports = {
devServer: {
proxy: "http://localhost:3344"
}
}
приложение Vue
<template>
<form @submit.prevent="sendFile" enctype="multipart/form-data">
<div class="field">
<input
type="file"
ref="files"
class="file-input"
@change="selectFiles"
/>
</div>
<div class="field">
<button class="button is-info">
Send
</button>
</div>
</form>
</template>
<script>
export default {
name: "Upload",
data() {
return {
file: '',
}
},
methods: {
selectFiles() {
this.file = this.$refs.file.files[0];
},
async sendFile() {
const formData = new FormData();
formData.append('file', this.file);
try {
await fetch('/upload', {
method: 'post',
body: formData,
})
} catch(err) {
console.log(err)
}
}
}
}
</script>
Экспресс приложение
const express = require('express');
const app = express();
app.post('/upload', (req, res) => {
res.json({received: 'yes'})
})
app.listen(3344, () => console.log("running on localhost:3344"))
Я использую Firefox и Safari в качестве тестовых браузеров. Я запускаю приложения на локальном хосте, на MacOS 10.14. Когда я пытаюсь отправить форму без прикрепленного файла, она работает как ожидается в обоих браузерах. Однако, когда я выбираю файл и нажимаю «Отправить», в Firefox запрос не выполняется, и в консоли появляется ошибка TypeError: "NetworkError when attempting to fetch resource."
. На консоли приложения Vue я получаю Proxy error: Could not proxy request /upload from 0.0.0.0:8080 to http://localhost:3344.
See https://nodejs.org/api/errors.html#errors_common_system_errors for more information (EPIPE).
Однако в Safari этого не происходит, и там он работает как положено.
Я думал, что это может быть версия Firefox или некоторые расширения, но я запускал ночную версию без надстроек, и она все еще не работает. Я также попытался использовать axios вместо fetch api, но возникла та же проблема.