formidable - SyntaxError: Unexpected token - in JSON at position 0 when sending POST request
formidable - SyntaxError: Unexpected token - in JSON at position 0 when sending POST request
我正在构建后端,以便在遵循教程的同时为我的 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(路线)
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(控制器)
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);
});
});
};
问题:当我 POST 使用 Postman 请求创建一个类别时,如下所示:
Headers 和我使用的其他数据是:
我收到这个错误:
我观察到的是:
由于我正在学习一个特定的教程,强大的版本可能会更新,因此出现语法错误。尽管如此,我仍然无法找到使用 formidable.
处理 IncomingForm()
的任何特定解决方案
错误消息没有显示任何特定的书面代码行,因此很难找出实际问题所在。
我检查了我的博客架构模型定义,看起来不错,但我没有发现任何问题。
目前,我无法找到解决此问题的方法,因为我可能没有意识到我可能犯下的任何小错误。
我已附上所有相关文件,如果需要,我可以制作任何其他文件。
我被困在这里无法继续,请您解决我的问题。
谢谢。
移除中间件app.use(express.urlencoded({extended: false}));
app.use(express.json())
和
app.use(cookieParser())
从server.js然后尝试
当您使用表单数据发送数据时。你设定
Content-Type: application/json
错了。
设置 Content-Type: multipart/form-data
如果以后有人遇到这个错误,请参考这个答案。
以上答案可能适用于任何其他情况,因此也必须尝试一下。
我的修复:
我将 formidable version 2.0.1
与应用程序中间件一起使用如下:
app.use(express.urlencoded({extended: false}));
app.use(express.json());
app.use(morgan('dev'));
app.use(cookieParser());
我发现 formidable 不适用于上述这些中间件,并且无法使用 formidable POST 图像。
我的解决方案:
我发现了 express-formidable
。
npm install express-formidable
安装后,我还用新的语法修复了语法(旧的),即
blog.photo.data = fs.readFileSync(files.photo.filepath);
blog.photo.contentType = files.photo.mimetype;
filepath
和 mimetype
在此之后,当我用邮递员测试它时,我也将 Content-Type 设置为默认值(检查隐藏的 header 这是默认值)并且它工作得很好。
我正在构建后端,以便在遵循教程的同时为我的 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(路线)
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(控制器)
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);
});
});
};
问题:当我 POST 使用 Postman 请求创建一个类别时,如下所示:
Headers 和我使用的其他数据是:
我收到这个错误:
我观察到的是:
由于我正在学习一个特定的教程,强大的版本可能会更新,因此出现语法错误。尽管如此,我仍然无法找到使用 formidable.
处理IncomingForm()
的任何特定解决方案错误消息没有显示任何特定的书面代码行,因此很难找出实际问题所在。
我检查了我的博客架构模型定义,看起来不错,但我没有发现任何问题。
目前,我无法找到解决此问题的方法,因为我可能没有意识到我可能犯下的任何小错误。
我已附上所有相关文件,如果需要,我可以制作任何其他文件。
我被困在这里无法继续,请您解决我的问题。
谢谢。
移除中间件app.use(express.urlencoded({extended: false})); app.use(express.json()) 和 app.use(cookieParser())
从server.js然后尝试
当您使用表单数据发送数据时。你设定
Content-Type: application/json
错了。
设置 Content-Type: multipart/form-data
如果以后有人遇到这个错误,请参考这个答案。
以上答案可能适用于任何其他情况,因此也必须尝试一下。
我的修复:
我将 formidable version 2.0.1
与应用程序中间件一起使用如下:
app.use(express.urlencoded({extended: false}));
app.use(express.json());
app.use(morgan('dev'));
app.use(cookieParser());
我发现 formidable 不适用于上述这些中间件,并且无法使用 formidable POST 图像。
我的解决方案:
我发现了 express-formidable
。
npm install express-formidable
安装后,我还用新的语法修复了语法(旧的),即
blog.photo.data = fs.readFileSync(files.photo.filepath);
blog.photo.contentType = files.photo.mimetype;
filepath
和 mimetype
在此之后,当我用邮递员测试它时,我也将 Content-Type 设置为默认值(检查隐藏的 header 这是默认值)并且它工作得很好。