Грозный — SyntaxError: Unexpected token — в JSON в позиции 0 при отправке POST-запроса

Я создаю серверную часть для создания сообщений в блоге для своего веб-приложения, следуя руководству.

Я использую следующие технологии: MongoDB, express.js, грозный.

Соответствующие файлы:

сервер.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.info(`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);
        });
    });
};

Проблема: когда я отправляю запрос с помощью Postman, чтобы создать категорию, которая выглядит следующим образом: Грозный — SyntaxError: Unexpected token — в JSON в позиции 0 при отправке POST-запроса

Заголовки и другие данные, которые я использовал: Грозный — SyntaxError: Unexpected token — в JSON в позиции 0 при отправке POST-запроса

Я получаю эту ошибку: Грозный — SyntaxError: Unexpected token — в JSON в позиции 0 при отправке POST-запроса

Вещи, которые я наблюдал:

  1. Поскольку я следую определенному руководству, грозные версии могут быть обновлены, отсюда и синтаксическая ошибка. Тем не менее, мне не удалось найти конкретных решений для обработки IncomingForm() с помощью грозный.

  2. Сообщение об ошибке не показывает какой-либо конкретной строки написанного кода, поэтому трудно понять, в чем заключается реальная проблема.

  3. Я проверил определение модели схемы моего блога, и все выглядит нормально, и я не мог понять, что там что-то не так.

В настоящее время я не могу найти решение этой проблемы, поскольку я могу не знать о каких-либо незначительных ошибках, которые я мог совершить.

Я приложил все свои соответствующие файлы, и я могу создать любые другие файлы, если это необходимо.

Прошу вас разобраться с моей проблемой, так как я застрял здесь и не могу двигаться дальше.

Спасибо.

переключитесь с данных формы на необработанные и выберите оттуда json

Jimmy 06.05.2022 23:34

@Джимми, я пробовал это, но запрос не отправляется.

Shrish Sharma 07.05.2022 14:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
42
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Удалить промежуточное ПО app.use(express.urlencoded({extended: false})); app.use(express.json()) И app.use(cookieParser())

Из server.js, а затем попробуйте

Этот пост кажется неполным. Пожалуйста, добавьте больше деталей, чтобы четко обозначить проблему и способы ее решения.

Tyler2P 07.05.2022 10:12

Я попробовал решение, которое вы предоставили. Итак, когда я удалил все эти промежуточные программы, выдается ошибка form.parse(), т. е. Image could not upload. Насколько я знаю, моя первоначальная проблема возникла из-за функции загрузки изображений с использованием библиотеки formidable.

Shrish Sharma 07.05.2022 14:35

Пока вы отправляете данные, используя данные формы. Ты устанавливаешь 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());

Я обнаружил, что грозный не работает с этим промежуточным программным обеспечением, и невозможно размещать изображения с помощью грозного.

Мое решение: Я узнал о express-formidable.

npm install express-formidable

После установки я также исправил синтаксис (старый) с новым, т.е.

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

filepath и mimetype

После этого, когда я тестировал его с почтальоном, я также установил Content-Type по умолчанию (проверил скрытый заголовок, который используется по умолчанию), и это сработало хорошо.

Другие вопросы по теме