javascript - 使用多部分数据获取请求在 Firefox 中失败,但在 Safari 中失败
问题描述
我正在尝试使用 fetch api 在 Vue 应用程序上进行简单的文件上传。
在后端有一个简单的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,但出现了同样的问题。
解决方案
奇怪的是,当我在 express 后端添加中间件时,这个问题得到了修复:
const express = require('express');
const multer = require('multer');
const app = express();
const upload = multer({
dest: './uploads/'
})
app.post('/upload', upload.single('file'), (req, res) => {
res.json({received: 'yes'})
})
app.listen(3344, () => console.log("running on localhost:3344"))
我仍然不知道为什么没有 Firefox 中的中间件就无法工作,但在 safari 中却可以。
推荐阅读
- postgresql - ActiveRecord::StatementInvalid: PG::SyntaxError: 错误
- python - Python,应用于对象属性列表的映射函数
- database - Postgres 长时间运行的事务在父分区表上保持锁定
- c# - 从 ListBox 中删除分隔符
- javascript - 使用 xlsx-populate.js 将 wrapText 应用于列
- ssl-certificate - iOS 上的 Xamrin 应用程序在新 TLS 证书上出现信任失败错误 - AWS ELB
- python - 字符串的 eval() 的替代方法
- javascript - 如何使用 JavaScript 添加行?
- android - 更改我的android图标后,这发生在颤动中
- c++ - 如何更改图像所有三个通道的亮度?