我正在为我的Web应用程序创建博客文章的后端,同时遵循教程。
我使用的技术是MongoDB、express.js、强大
相关文件包括:
server.js
......
// middlewares
app.use(express.urlencoded({extended: false}));
app.use(express.json());
app.use(morgan('dev'));
app.use(cookieParser());
// cors
if(process.env.NODE_ENV == 'development') {
app.use(cors({origin: `${process.env.CLIENT_URL}`}));
}
// routes middleware
app.use('/api', authRoutes);
app.use('/api', userRoutes);
app.use('/api', blogRoutes);
app.use('/api', categoryRoutes);
app.use('/api', tagRoutes);
// port
const port = process.env.PORT || 8000;
// Listening App
app.listen(port, () => {
console.log(`Server is running on PORT ${port}`);
})
博客架构模型:
const mongoose = require('mongoose');
const { ObjectId } = mongoose.Schema;
const blogSchema = new mongoose.Schema(
{
title: {
type: String,
trim: true,
min: 3,
max: 160,
required: true
},
slug: {
type: String,
unique: true,
index: true
},
body: {
type: {},
required: true,
min: 200,
max: 2000000
},
excerpt: {
type: String,
max: 1000
},
mtitle: {
type: String
},
mdesc: {
type: String
},
photo: {
data: Buffer,
contentType: String
},
categories: [{ type: ObjectId, ref: 'Category', required: true }],
tags: [{ type: ObjectId, ref: 'Tag', required: true }],
postedBy: {
type: ObjectId,
ref: 'User'
}
},
{ timestamp: true }
);
module.exports = mongoose.model('Blog', blogSchema);
blog.js(Routes)
const express = require('express');
const router = express.Router();
const { create } = require('../controllers/blog');
const { requireSignin, adminMiddleware } = require('../controllers/auth');
router.post('/blog', requireSignin, adminMiddleware, create);
module.exports = router;
blog.js(controllers)
const Blog = require('../models/blog');
const Category = require('../models/category');
const Tag = require('../models/tag');
const formidable = require('formidable');
const slugify = require('slugify');
const stripHtml = require('string-strip-html');
const _ = require('lodash');
const { errorHandler } = require('../helpers/dbErrorHandler');
const fs = require('fs');
exports.create = (req, res) => {
let form = new formidable.IncomingForm();
form.keepExtensions = true;
form.parse(req, (err, fields, files) => {
if (err) {
return res.status(400).json({
error: 'Image could not upload'
});
}
const { title, body, categories, tags } = fields;
let blog = new Blog();
blog.title = title;
blog.body = body;
blog.slug = slugify(title).toLowerCase();
blog.mtitle = `${title} | ${process.env.APP_NAME}`;
blog.mdesc = stripHtml(body.substring(0, 160));
blog.postedBy = req.user._id;
if (files.photo) {
if (files.photo.size > 10000000) {
return res.status(400).json({
error: 'Image should be less then 1mb in size'
});
}
blog.photo.data = fs.readFileSync(files.photo.path);
blog.photo.contentType = files.photo.type;
}
blog.save((err, result) => {
if (err) {
return res.status(400).json({
error: errorHandler(err)
});
}
res.json(result);
});
});
};
问题:当我使用Postman发布一个请求以创建一个类别时,如下所示:
我使用的标题和其他数据是:
我得到这个错误:
我观察到的事情是:
1.由于我正在学习一个特定的教程,强大的版本可能会更新,因此出现语法错误。但是,我仍然无法找到任何使用important处理IncomingForm()
的特定解决方案。
1.错误消息没有显示任何特定的代码行,因此很难找出实际问题所在。
1.我已经检查了我的博客模式模型定义,它看起来很好,不能找出任何错误。
目前,我无法找到解决这个问题的办法,因为我可能不知道我可能犯下的任何小错误。
我已经附上了我所有的相关文件,我可以生产任何其他文件,如果需要的话。
我请求你通过我的问题,因为我被困在这里,无法进一步进行。
谢谢
4条答案
按热度按时间kmb7vmvb1#
使用表单数据发送数据时。
Content-Type: application/json
设置错误。设置Content-Type: multipart/form-data
oug3syen2#
删除中间件app.use(express.urlencoded({extended:false})); app.use(express.json())和app.use(cookieParser())
从server.js,然后尝试
y53ybaqx3#
如果将来有人遇到此错误,请参考此答案。
以上答案可能适用于任何其他情况,因此必须尝试它们。
我的修复:
我使用
formidable version 2.0.1
沿着应用中间件,如下所示:app.use(express.urlencoded({extended: false}));
app.use(express.json());
app.use(morgan('dev'));
app.use(cookieParser());
我发现强大的不工作与这些上述中间件,它是不可能的POST图像使用强大的。
**我的解决方案:**我发现了
express-formidable
。安装后,我还使用新的i.e.修复了语法(旧)。
filepath
和mimetype
在此之后,当我用postman测试它时,我还将Content-Type设置为默认值(检查了默认的隐藏头),它工作得很好。
iqih9akk4#
做同样的项目,问题实际上是在mdesc中,并不可怕,我添加了这个:
通过在
stripHtml(...).result
之后添加.toString()
,可以将值转换为字符串,从而解决强制转换错误。别忘了这个