node.js - 错误:在 MERN 中上传表单数据时请求失败,状态码为 404
问题描述
我正在尝试在 MERN 堆栈中插入表单数据和一张图像。
问题是图像已成功上传到我的文件夹中,但表单数据未插入到我的 mongodb 数据库中。图像路径也没有在 mongodb 中创建。我正在使用multer
这个。
我在浏览器控制台中遇到的错误
POSThttp://localhost:3000/teacher
[HTTP/1.1 400 Bad Request 22ms]
Error: Request failed with status code 400
createError createError.js:16
settle settle.js:17
onloadend xhr.js:66
dispatchXhrRequest xhr.js:80
xhrAdapter xhr.js:15
dispatchRequest dispatchRequest.js:58
request Axios.js:108
method Axios.js:140
wrap bind.js:9
handleSubmit Register.js:19
React 14
unstable_runWithPriority scheduler.development.js:468
React 15
js index.js:7
js main.chunk.js:753
Webpack 7
(后端)路由器-->Auth.js
const mongoose = require("mongoose")
const express = require("express")
const router = express()
require("../db/conn")
const User = require("../model/userSchema")
const Teacher = require("../model/userSchemaTeacher")
const multer = require('multer');
const { v4: uuidv4 } = require('uuid');
let path = require('path');
const storage = multer.diskStorage({
destination: function(req, file, cb) {
cb(null, 'images','pdf');
},
filename: function(req, file, cb) {
cb(null, uuidv4() + '-' + Date.now() + path.extname(file.originalname));
}
});
const fileFilter = (req, file, cb) => {
const allowedFileTypes = ['image/jpeg', 'image/jpg', 'image/png'];
if(allowedFileTypes.includes(file.mimetype)) {
cb(null, true);
} else {
cb(null, false);
}
}
let upload = multer({ storage, fileFilter });
router.route('/teacher').post(upload.single('photo'), (req, res) => {
const school = req.body.school;
const photo = req.body.photo;
const address = req.file.address;
const newUserData = {
school,
photo,
address
}
const newUser = new User(newUserData);
newUser.save()
.then(() => res.json('User Added'))
.catch(err => res.status(400).json('Error: ' + err));
});
module.exports = router
(前端)register.js
import React, { useState } from "react";
import axios from "axios";
const FormData = require("form-data")
const Register = () => {
const [newUser, setNewUser] = useState({
school: "",
address: "",
photo: "",
});
const handleSubmit = (e) => {
e.preventDefault();
const formData = new FormData();
formData.append("school", newUser.school);
formData.append("photo", newUser.photo);
formData.append("address", newUser.address);
axios
.post("http://localhost:3000/teacher", formData)
.then((res) => {
console.log(res);
})
.catch((err) => {
console.log(err);
});
};
const handleChange = (e) => {
setNewUser({ ...newUser, [e.target.name]: e.target.value });
};
const handlePhoto = (e) => {
setNewUser({ ...newUser, photo: e.target.files[0] });
};
return (
<>
<div className="container main">
<div className="row">
<div className="col-sm-6 col-md-6 col-lg-6">
<form onSubmit={handleSubmit} encType="multipart/form-data">
<div class="mb-3">
<label for="exampleInputPassword1" class="form-label">
Your school
</label>
<input
type="text"
class="form-control"
id="exampleInputPassword1"
id="school"
name="school"
value={newUser.school}
onChange={handleChange}
/>
</div>
<div class="input-group mb-3">
<input
type="file"
accept=".png, .jpg, .jpeg"
name="photo"
onChange={handlePhoto} type="file" class="form-control" id="inputGroupFile02" />
</div>
<div class="mb-3">
<label for="exampleInputEmail1" class="form-label">
your address
</label>
<input
type="text"
id="address"
name="address"
value={newUser.address}
onChange={handleChange}
class="form-control"
aria-describedby="emailHelp"
/>
<div id="emailHelp" class="form-text">
We'll never share your email with anyone else.
</div>
</div>
<div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" />
<label class="form-check-label" for="exampleCheck1">
Check me out
</label>
</div>
<button
value="register"
type="submit"
class="btn btn-primary"
>
Submit
</button>
</form>
</div>
</div>
</div>
</>
);
};
export default Register;
如何调试此错误或解决此错误?
解决方案
您在后端遗漏了一些东西,在这里很难找到错误,您需要对其进行调试。
或者我会更喜欢 npm 包
npm i express-fileupload
app.post('/upload', function(req, res) {
console.log(req.files.foo); // the uploaded file object
});
而不是使用使事情变得复杂的 multer 你可以使用这个包 你只需要在这里导入它并像我在 server.js 中那样使用它作为中间件
在此之后,您几乎不需要编写几行代码
检查此 blog-controller.js 中的第 22 到 34 行
我希望你会发现这更容易
推荐阅读
- c++ - % 在变量旁边的代码中是什么意思?
- c# - Angular 6 不显示从 Asp Net Web API 2.2 检索到的数据
- python - 为什么 PyYAML/ruamel 在 Python 2 上结合转义代理?
- c# - 如何在 .netcore/Linux 中实现 Diffie Hellman
- tensorflow - C++中的Tensorflow:成功读取LSTM编码器解码器模型的协议缓冲区
- dart - Dart 类型别名
- typo3 - Typo3 用本地文件夹路径中的大数据 URL 替换大外部图像的 src
- android - 重新创建应用程序实例时,getApplicationContext() 返回 null
- mongodb - 如何使用 mongodb 查询订购和检索数据?
- amazon-web-services - ECS服务自行启动任务