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 和我使用的其他数据是:

我收到这个错误:

我观察到的是:

  1. 由于我正在学习一个特定的教程,强大的版本可能会更新,因此出现语法错误。尽管如此,我仍然无法找到使用 formidable.

    处理 IncomingForm() 的任何特定解决方案
  2. 错误消息没有显示任何特定的书面代码行,因此很难找出实际问题所在。

  3. 我检查了我的博客架构模型定义,看起来不错,但我没有发现任何问题。

目前,我无法找到解决此问题的方法,因为我可能没有意识到我可能犯下的任何小错误。

我已附上所有相关文件,如果需要,我可以制作任何其他文件。

我被困在这里无法继续,请您解决我的问题。

谢谢。

移除中间件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;

filepathmimetype

在此之后,当我用邮递员测试它时,我也将 Content-Type 设置为默认值(检查隐藏的 header 这是默认值)并且它工作得很好。