Express. js ошибка приложения: невозможно прочитать свойство 'Transfer-Encoding' из неопределенного - PullRequest
0 голосов
/ 25 марта 2020

Я работаю над приложением для ведения блога (нажмите на ссылку, чтобы увидеть репозиторий GitHub ) с Express, E JS и MongoDB.

Я пытаюсь ввести функцию добавить пост-изображение . Будучи совершенно новым для Express, я озадачен проблемой, с которой я столкнулся.

Форма добавления сообщения:

<form action="/dashboard/post/add" method="POST" enctype="multipart/form-data" class="mb-0">
  <div class="form-group">
    <input type="text" class="form-control" name="title" value="<%= typeof form!='undefined' ? form.titleholder : '' %>" placeholder="Title" />
  </div>
  <div class="form-group">
    <input type="text" class="form-control" name="excerpt" value="<%= typeof form!='undefined' ? form.excerptholder : '' %>" placeholder="Excerpt" />
  </div>
  <div class="form-group">
    <textarea rows="5" class="form-control" name="body" placeholder="Full text"><%= typeof form!='undefined' ? form.bodyholder : '' %></textarea>
  </div>
  <label for="postimage">Upload an image</label>
  <div class="form-group">
    <input type="file" name="postimage" id="postimage" size="20">
  </div>
  <div class="form-group d-flex mb-0">
    <div class="w-50 pr-1">
      <input type="submit" value="Add Post" class="btn btn-block btn-md btn-success">
    </div>
    <div class="w-50 pl-1">
      <a href="/dashboard" class="btn btn-block btn-md btn-success">Cancel</a>
    </div>
  </div>
</form>

В контроллере мой addPost() метод выглядит так :

const Post = require('../../models/post');
const { validationResult } = require('express-validator');

const storage = multer.diskStorage({
    destination: function (req, file, cb) {
            cb(null, './uploads/images')
    },
    filename: function (req, file, cb) {
            cb(null, file.fieldname + '-' + Date.now() + '.png')
    }
});

const upload = multer({ storage: storage }).single('postimage');

exports.addPost = (req, res, next) => {

    upload(function(err) {
        if (err) {
            console.log("There was an error uploading the image.");
        }
        res.json({
            success: true,
            message: 'Image uploaded!'
        });
    })

    var form = {
        titleholder: req.body.title,
        excerptholder: req.body.excerpt,
        bodyholder: req.body.body
    };

    const errors = validationResult(req);

    const post = new Post();

    post.title = req.body.title;
    post.short_description = req.body.excerpt;
    post.full_text = req.body.body;

    if (!errors.isEmpty()) {
        req.flash('danger', errors.array())
        res.render('admin/addpost', {
            layout: 'admin/layout',
            website_name: 'MEAN Blog',
            page_heading: 'Dashboard',
            page_subheading: 'Add New Post',
            form: form
        });
    } else {
        post.save(function(err) {
            if (err) {
                console.log(err);
                return;
            } else {
                req.flash('success', "The post was successfully added");
                req.session.save(() => res.redirect('/dashboard'));
            }
        });
    }
}

У меня также есть const multer = require("multer"); в верхней части (контроллера).

Форма «Добавить новое сообщение» работала нормально, пока я не попытался добавить эту функцию загрузки. Код, который у меня сейчас есть, выдает эту ошибку:

Cannot read property 'transfer-encoding' of undefined
    at hasbody (C:\Path\To\Application\node_modules\type-is\index.js:93:21)

Что я делаю не так?

1 Ответ

2 голосов
/ 25 марта 2020

Вам не хватает req и res внутри вашего upload(), попробуйте добавить эти два типа upload( req, res , function (err){

upload(req, res, function (err) {
        if (err) {
            console.log("There was an error uploading the image.");
        }
        res.json({
            success: true,
            message: 'Image uploaded!'
        });
    })
...