Я создаю серверную часть для создания сообщений в блоге для своего веб-приложения, следуя руководству.
Я использую следующие технологии: 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, чтобы создать категорию, которая выглядит следующим образом:
Заголовки и другие данные, которые я использовал:
Вещи, которые я наблюдал:
Поскольку я следую определенному руководству, грозные версии могут быть обновлены, отсюда и синтаксическая ошибка. Тем не менее, мне не удалось найти конкретных решений для обработки IncomingForm()
с помощью грозный.
Сообщение об ошибке не показывает какой-либо конкретной строки написанного кода, поэтому трудно понять, в чем заключается реальная проблема.
Я проверил определение модели схемы моего блога, и все выглядит нормально, и я не мог понять, что там что-то не так.
В настоящее время я не могу найти решение этой проблемы, поскольку я могу не знать о каких-либо незначительных ошибках, которые я мог совершить.
Я приложил все свои соответствующие файлы, и я могу создать любые другие файлы, если это необходимо.
Прошу вас разобраться с моей проблемой, так как я застрял здесь и не могу двигаться дальше.
Спасибо.
@Джимми, я пробовал это, но запрос не отправляется.
Удалить промежуточное ПО app.use(express.urlencoded({extended: false})); app.use(express.json()) И app.use(cookieParser())
Из server.js, а затем попробуйте
Этот пост кажется неполным. Пожалуйста, добавьте больше деталей, чтобы четко обозначить проблему и способы ее решения.
Я попробовал решение, которое вы предоставили. Итак, когда я удалил все эти промежуточные программы, выдается ошибка form.parse()
, т. е. Image could not upload
. Насколько я знаю, моя первоначальная проблема возникла из-за функции загрузки изображений с использованием библиотеки formidable
.
Пока вы отправляете данные, используя данные формы. Ты устанавливаешь
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 по умолчанию (проверил скрытый заголовок, который используется по умолчанию), и это сработало хорошо.
переключитесь с данных формы на необработанные и выберите оттуда json