xhr携带formData发请求nodejs报500

小菜袅又来提问啦
我本来前端以这样的方式提交请求:

="http://localhost:3000/api/swiper" method="post" enctype="multipart/form-data"> ="file" name="avatar" id="file" multiple="multiple"> ="" alt="" id="img">

以这样的方式提交请求把图片给到后端很顺利,但是不用jquery又得不到响应数据,就想着不这样弄,把form表单去了
前端:

<input type="file" name="avatar" id="file" multiple="multiple">
<button id="btn">上传button>
<img src="" alt="" id="img">
<script>
        const btn = document.querySelector('#btn')
        const inp_file = document.querySelector('#file')
        btn.addEventListener('click',function(){
            var xhr = new XMLHttpRequest();
            xhr.open('POST', 'http://localhost:3000/api/swiper');
            xhr.setRequestHeader('Content-Type', "multipart/form-data; boundary=---------------------------" + Date.now().toString(16));
            let file = inp_file.files[0]
            console.log(file);
            let formdata = new FormData()
            formdata.append('avatar',file)
            xhr.send(formdata);
            xhr.onreadystatechange = function() {
                if(xhr.readyState === 4 && xhr.status === 200) {
                    console.log(xhr.responseText);
                }
            }
        })
    script>

nodejs:

const express = require('express')
const router = express.Router()
const multer = require('multer')
const mysql = require('../model/orm')
let date = new Date()
const moment = require('moment')
let time = date.getTime()
let originalname;
let random = Math.floor(Math.random() * (1000 - 100 + 1)) + 100
let urlStr; 
let obj;
let arr = [];
let storage = multer.diskStorage({
    destination: function(req, file, cb) {
        cb(null, 'public/upload'); 
    },
    filename: function(req, file, cb) {
        originalname = Buffer.from(file.originalname, "latin1").toString("utf8");
        urlStr = time + '-' + random + '-' + originalname
        time = date.getTime()
        random = Math.floor(Math.random() * (10000 - 100 + 1)) + 100
        obj = {
            swi_url:'http://localhost:3000/upload/' + urlStr,
            swi_qiyong:'false',
            swi_type:"活动",
            swi_time:moment(new Date()).format()
        }
        arr.push(obj)
        cb(null, urlStr)
    }
})
let upload = multer({ storage: storage });
// upload.single('form'),
router.post('/',upload.single('avatar'),(req,res) => {
    try {
        console.log(req.file);
        console.log(req.body);
    } catch (err) {
        console.log(err);
        res.status(500).send(err);
    }
    // console.log(arr);
    // let swiper = mysql.model('swiper')
    // swiper.insert(arr,(err,data) => {
    //     if(err) {
    //         console.log(err);
    //         return 
    //     }
    //     res.send({
    //         code:200,
    //         msg:"post请求处理完毕"
    //     })
    // })
})
module.exports = router

这样之后,后端就报500,然后改来改去,要不就是req.body没数据要么就又是500,海子技术不行,底子差,头都快想烂了,是因为啥啊,help海子吧

贴下错误信息

该回答引用GPTᴼᴾᴱᴺᴬᴵ
出现500错误,通常是因为服务器端出现了错误,导致服务器无法处理请求并返回响应。在您的情况下,很可能是出现了一些问题导致服务器无法正确处理上传的文件。

以下是一些可能的解决方案:

  1. 确认服务器端的路由和处理上传请求的代码是否正确,确保没有任何语法错误和逻辑问题。
  2. 确认文件上传的文件夹是否存在且权限正确,可以在路由处理上传的代码中添加日志,查看文件是否成功上传到正确的文件夹中。
  3. 确认前端发送的请求头是否正确,可以在路由处理上传的代码中打印请求头信息,查看是否正确设置了“Content-Type”为“multipart/form-data”。
  4. 确认前端发送的formData数据是否正确,可以在路由处理上传的代码中打印formData数据,查看是否正确解析出文件。
  5. 确认服务器端的文件上传中间件是否正确,可以使用其他中间件进行尝试。
  6. 如果以上方法都不行,可以尝试在服务器端处理上传文件的代码中添加try-catch语句,捕获可能出现的错误并打印出来,便于调试和解决问题。

希望以上方法可以帮助您解决问题。