如何修复代码,以便我可以将图像上传到 mongodb 而不会出现 post 错误?
How can I fix the code so I can upload image to mongodb and not getting post error?
我有一些用户信息要保存在 mongodb 数据库中。我通过在正文中填写一些表单数据字段,用 postman 检查了 API post。名称或电子邮件等简单数据,简单字符串可以完美工作,但是当我更改代码(在 controller.js 文件中)以便我也可以获得图像文件时,它会抛出此一般错误:“无法 POST /api/users”。代码对我来说似乎没问题,但缺少某些东西并且无法弄清楚。
server.js 文件:
const express = require('express');
const dotenv = require('dotenv');
const morgan = require('morgan');
const bodyparser = require("body-parser");
const path = require('path');
const fileUpload = require('express-fileupload');
const connectDB = require('./server/database/connection');
const bodyParser = require('body-parser');
const app = express();
app.use(fileUpload());
dotenv.config({path : 'config.env'})
const PORT = process.env.PORT || 8080
//log requests
app.use(morgan('tiny'));
//mongodb connection
connectDB();
//parse request to body-parser
app.use(bodyparser.urlencoded({extended : false}))
app.use(bodyparser.json())
//set view engine
app.set("view engine", "ejs")
//app.set("views", path.resolve(__dirname, "views/ejs"))
//load assets
app.use('/css', express.static(path.resolve(__dirname, "assets/css")))
app.use('/img', express.static(path.resolve(__dirname, "assets/img")))
app.use('/js', express.static(path.resolve(__dirname, "assets/js")))
//load routers
app.use('/', require('./server/routes/router'))
app.listen(PORT, ()=>{console.log(`Server is running on http://localhost:${PORT}`)});
router.js 文件:
const express = require('express');
const route = express.Router()
const services = require('../services/render');
const controller = require('../controller/controller');
route.get('/', services.homeRoutes);
route.get('/add-user', services.add_user);
route.get('/update-user', services.update_user);
//API
route.post('/api/users', controller.create);
route.get('/api/users', controller.find);
route.put('/api/users/:id', controller.update);
route.delete('/api/users/:id', controller.delete);
module.exports = route
model.js 文件:
const mongoose = require('mongoose');
var schema = new mongoose.Schema({
profile_picture: {
data: Buffer,
contentType: String
},
name: {
type: String,
required: true
},
email: {
type: String,
required: true,
unique: true
},
gender: String,
favorite_movies: {
type: String,
text: true
}
})
const Userdb = mongoose.model('userdb', schema);
module.exports = Userdb;
controller.js 文件:
var multer = require('multer');
var fs = require('fs');
var path = require('path');
var storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'uploads')
},
filename: (req, file, cb) => {
cb(null, file.fieldname + '-' + Date.now())
}
});
var upload = multer({ storage: storage });
var Userdb = require('../model/model');
//create and save new user
exports.create = upload.single('image'), (req, res, next)=>{
//validate request
if(!req.body){
res.status(400).send({ message : "Content cannot be empty!"});
return;
}
//new user
const user = new Userdb({
profile_picture : {
data: fs.readFileSync(path.join(__dirname + '/uploads/' + req.file.filename)),
contentType: 'image/png'
},
name : req.body.name,
email : req.body.email,
gender : req.body.gender,
favorite_movies : req.body.favorite_movies
})
//save user in the database
user
.save(user)
.then(data=>{
//res.send(data)
res.redirect('/add-user');
})
.catch(err=>{
res.status(500).send({
message : err.message || "Some error occurred while creating a create operation"
});
});
}
_form.ejs 文件:
<!-- form handling -->
<form action="/api/users" method="POST" id="add_user">
<div class="new_user">
<div class="form-group">
<label for="image" class="text-light">Profile Picture<br><br></label>
<div id="image">
Choose File
<input type="file" id="image" name="image" accept="image/*" class="hide_file">
</div>
</div>
<div class="form-group">
<label for="name" class="text-light"><br><br>Name</label>
<input type="hidden" name="id" value="">
<input type="text" name="name" value="" placeholder="Mark Harris">
</div>
<div class="form-group">
<label for="Email" class="text-light">Email</label>
<input type="text" name="email" value="" placeholder="example@gmail.com">
</div>
<div class="form-group">
<label for="gender" class="text-light">Gender</label>
<div class="radio inline">
<input type="radio" id="radio-1" name="gender" value="Male" >
<label for="radio-1" class="radio-label">Male</label>
</div>
<div class="radio inline">
<input type="radio" id="radio-2" name="gender" value="Female" >
<label for="radio-2" class="radio-label">Female</label>
</div>
</div>
<div class="form-group">
<label for="favorite_movies" class="text-light">Favorite Movies</label>
<textarea name="favorite_movies" placeholder="Avengers: Age of Ultron
Shrek
..."></textarea>
</div>
<div class="form-group">
<button type="submit" class="btn text-dark update">Save</button>
</div>
</div>
</form>
我认为问题出在我创建并保存新用户的 controller.js 文件中的某处,exports.create = ......
问题是路由处理程序没有正确实现:它returns上传了中间件,并且没有处理响应
你需要拆分它们,导出上传和创建,然后在POST处理程序中调用它们:
controller.js 文件:
exports.upload = upload.single('image');
//create and save new user
exports.create = (req, res, next)=>{
router.js 文件:
//API
route.post('/api/users', controller.upload, controller.create);
我有一些用户信息要保存在 mongodb 数据库中。我通过在正文中填写一些表单数据字段,用 postman 检查了 API post。名称或电子邮件等简单数据,简单字符串可以完美工作,但是当我更改代码(在 controller.js 文件中)以便我也可以获得图像文件时,它会抛出此一般错误:“无法 POST /api/users”。代码对我来说似乎没问题,但缺少某些东西并且无法弄清楚。
server.js 文件:
const express = require('express');
const dotenv = require('dotenv');
const morgan = require('morgan');
const bodyparser = require("body-parser");
const path = require('path');
const fileUpload = require('express-fileupload');
const connectDB = require('./server/database/connection');
const bodyParser = require('body-parser');
const app = express();
app.use(fileUpload());
dotenv.config({path : 'config.env'})
const PORT = process.env.PORT || 8080
//log requests
app.use(morgan('tiny'));
//mongodb connection
connectDB();
//parse request to body-parser
app.use(bodyparser.urlencoded({extended : false}))
app.use(bodyparser.json())
//set view engine
app.set("view engine", "ejs")
//app.set("views", path.resolve(__dirname, "views/ejs"))
//load assets
app.use('/css', express.static(path.resolve(__dirname, "assets/css")))
app.use('/img', express.static(path.resolve(__dirname, "assets/img")))
app.use('/js', express.static(path.resolve(__dirname, "assets/js")))
//load routers
app.use('/', require('./server/routes/router'))
app.listen(PORT, ()=>{console.log(`Server is running on http://localhost:${PORT}`)});
router.js 文件:
const express = require('express');
const route = express.Router()
const services = require('../services/render');
const controller = require('../controller/controller');
route.get('/', services.homeRoutes);
route.get('/add-user', services.add_user);
route.get('/update-user', services.update_user);
//API
route.post('/api/users', controller.create);
route.get('/api/users', controller.find);
route.put('/api/users/:id', controller.update);
route.delete('/api/users/:id', controller.delete);
module.exports = route
model.js 文件:
const mongoose = require('mongoose');
var schema = new mongoose.Schema({
profile_picture: {
data: Buffer,
contentType: String
},
name: {
type: String,
required: true
},
email: {
type: String,
required: true,
unique: true
},
gender: String,
favorite_movies: {
type: String,
text: true
}
})
const Userdb = mongoose.model('userdb', schema);
module.exports = Userdb;
controller.js 文件:
var multer = require('multer');
var fs = require('fs');
var path = require('path');
var storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'uploads')
},
filename: (req, file, cb) => {
cb(null, file.fieldname + '-' + Date.now())
}
});
var upload = multer({ storage: storage });
var Userdb = require('../model/model');
//create and save new user
exports.create = upload.single('image'), (req, res, next)=>{
//validate request
if(!req.body){
res.status(400).send({ message : "Content cannot be empty!"});
return;
}
//new user
const user = new Userdb({
profile_picture : {
data: fs.readFileSync(path.join(__dirname + '/uploads/' + req.file.filename)),
contentType: 'image/png'
},
name : req.body.name,
email : req.body.email,
gender : req.body.gender,
favorite_movies : req.body.favorite_movies
})
//save user in the database
user
.save(user)
.then(data=>{
//res.send(data)
res.redirect('/add-user');
})
.catch(err=>{
res.status(500).send({
message : err.message || "Some error occurred while creating a create operation"
});
});
}
_form.ejs 文件:
<!-- form handling -->
<form action="/api/users" method="POST" id="add_user">
<div class="new_user">
<div class="form-group">
<label for="image" class="text-light">Profile Picture<br><br></label>
<div id="image">
Choose File
<input type="file" id="image" name="image" accept="image/*" class="hide_file">
</div>
</div>
<div class="form-group">
<label for="name" class="text-light"><br><br>Name</label>
<input type="hidden" name="id" value="">
<input type="text" name="name" value="" placeholder="Mark Harris">
</div>
<div class="form-group">
<label for="Email" class="text-light">Email</label>
<input type="text" name="email" value="" placeholder="example@gmail.com">
</div>
<div class="form-group">
<label for="gender" class="text-light">Gender</label>
<div class="radio inline">
<input type="radio" id="radio-1" name="gender" value="Male" >
<label for="radio-1" class="radio-label">Male</label>
</div>
<div class="radio inline">
<input type="radio" id="radio-2" name="gender" value="Female" >
<label for="radio-2" class="radio-label">Female</label>
</div>
</div>
<div class="form-group">
<label for="favorite_movies" class="text-light">Favorite Movies</label>
<textarea name="favorite_movies" placeholder="Avengers: Age of Ultron
Shrek
..."></textarea>
</div>
<div class="form-group">
<button type="submit" class="btn text-dark update">Save</button>
</div>
</div>
</form>
我认为问题出在我创建并保存新用户的 controller.js 文件中的某处,exports.create = ......
问题是路由处理程序没有正确实现:它returns上传了中间件,并且没有处理响应
你需要拆分它们,导出上传和创建,然后在POST处理程序中调用它们:
controller.js 文件:
exports.upload = upload.single('image');
//create and save new user
exports.create = (req, res, next)=>{
router.js 文件:
//API
route.post('/api/users', controller.upload, controller.create);