mongodb 强大- SyntaxError:意外的标记-在发送POST请求时位于JSON中的位置0

tvmytwxo  于 2023-05-22  发布在  Go
关注(0)|答案(4)|浏览(167)

我正在为我的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.我已经检查了我的博客模式模型定义,它看起来很好,不能找出任何错误。
目前,我无法找到解决这个问题的办法,因为我可能不知道我可能犯下的任何小错误。
我已经附上了我所有的相关文件,我可以生产任何其他文件,如果需要的话。
我请求你通过我的问题,因为我被困在这里,无法进一步进行。
谢谢

kmb7vmvb

kmb7vmvb1#

使用表单数据发送数据时。Content-Type: application/json设置错误。设置Content-Type: multipart/form-data

oug3syen

oug3syen2#

删除中间件app.use(express.urlencoded({extended:false})); app.use(express.json())和app.use(cookieParser())
从server.js,然后尝试

y53ybaqx

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

npm install express-formidable

安装后,我还使用新的i.e.修复了语法(旧)。

blog.photo.data = fs.readFileSync(files.photo.filepath);
blog.photo.contentType = files.photo.mimetype;

filepathmimetype

在此之后,当我用postman测试它时,我还将Content-Type设置为默认值(检查了默认的隐藏头),它工作得很好。

iqih9akk

iqih9akk4#

做同样的项目,问题实际上是在mdesc中,并不可怕,我添加了这个:

posts.mdesc = stripHtml(body.substring(0, 160)).result.toString();

通过在stripHtml(...).result之后添加.toString(),可以将值转换为字符串,从而解决强制转换错误。
别忘了这个

+files.photo.filepath

相关问题