【问题标题】:Multer Filename Of Undefined未定义的 Multer 文件名
【发布时间】:2020-06-19 02:26:52
【问题描述】:

我正在编写一个网站,就像博客一样,我们可以添加图片和文章。我正在使用 multer、mongodb 和 multer。但我收到一个错误提示

TypeError: Cannot read property 'filename' of undefined at C:\Users\agul\Desktop\NODEJS\veritabanı\routes\articles.js:58:33 ...

所以这可能是由于它找不到该 filenme 属性,我无法上传我的图像。但我不明白为什么它不起作用。

这是我的代码:

这是我的文章.js

  const express = require('express');
const router = express.Router();
const multer = require('multer');

// Article Model
let Article = require('../models/article');
// User Model
let User = require('../models/user');

router.get('/sonuc', function(req, res){
  if(req.query.search) {
    const regex = new RegExp(escapeRegex(req.query.search), 'gi');
    Article.find({"title": regex}, function(err, articles) {
        if(err) {
            console.log(err);
        } else {
           res.render("sonuc", { 
             articles: articles 
            });
        }
    });
  }
});

function escapeRegex(text) {
  return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
};

// Add Route
router.get('/add', ensureAuthenticated, function(req, res){

  res.render('add_article', {
    title:'Add Article'
  });
});

const upload = multer({dest: __dirname + '/public/uploadss'});

// Add Submit POST Route
router.post('/add',upload.single('img'),  function(req, res){

  req.checkBody('title','Title is required').notEmpty();
  //req.checkBody('author','Author is required').notEmpty();
  req.checkBody('body','Body is required').notEmpty();

  // Get Errors
  let errors = req.validationErrors();

  if(errors){
    res.render('add_article', {
      title:'Add Article',
      errors:errors
    });
  } else {
var article = new Article({
    title: req.body.title,
    author: req.user._id,
    img: '/uploads/' + req.file.filename,
    body: req.body.body,
   });

    article.save(function(err){
      if(err){
        console.log(err);
        return;
      } else {
        res.render('add_article', {
        });
      }
    });
  }
});

// Load Edit Form
router.get('/edit/:id', ensureAuthenticated, function(req, res){
  Article.findById(req.params.id, function(err, article){
    /*if(article.author != req.user._id){
      req.flash('danger', 'Not Authorized');
      return res.redirect('/');
    }*/
    res.render('edit_article', {
      title:'Edit Article',
      article:article
    });
  });
});

// Update Submit POST Route
router.post('/edit/:id', function(req, res){
  let article = {};
  article.title = req.body.title;
  article.author = req.body.author;
  article.body = req.body.body;

  let query = {_id:req.params.id}

  Article.update(query, article, function(err){
    if(err){
      console.log(err);
      return;
    } else {
      req.flash('success', 'Article Updated');
      res.redirect('/');
    }
  });
});

// Delete Article
router.delete('/:id', function(req, res){
  if(!req.user._id){
    res.status(500).send();
  }

  let query = {_id:req.params.id}

  Article.findById(req.params.id, function(err, article){
    if(article.author != req.user._id){
      res.status(500).send();
    } else {
      Article.remove(query, function(err){
        if(err){
          console.log(err);
        }
        res.send('Success');
      });
    }
  });
});

// Get Single Article
router.get('/:id', function(req, res){

  Article.findById(req.params.id, function(err, article){
    //User.findById(article.author, function(err, user){
      res.render('article', {
        article:article,
        //author: user.name
      });
    });
  });
//});

// Access Control
function ensureAuthenticated(req, res, next){
  if(req.isAuthenticated()){
    return next();
  } else {
    req.flash('danger', 'Please login');
    res.redirect('/users/login');
  }
}
module.exports = router;

另外我同时制作了img和articles的mongoose模型。一切似乎都是正确的,但我不明白我在哪里犯了错误。你能帮我吗 ?如果可以的话,我真的很感激。我已经创建了一个名为 uploads 的文件夹,并将 filnemane 定向为 /uploads,但它不起作用。

注意:这是我的 add_article.pug 文件。 扩展布局

block content
  h1 #{title}
  form(method='POST', action='/articles/add')
    #form-group
      label Title:
      input.form-control(name='title', type='text')
      #form-group
      label Author:
      input.form-control(name='author', type='text')
    #form-group
      label Body:
      textarea.form-control(name='body')
    .file-field.input-field(method="post", enctype="multipart/form-data")
      .btn.grey
        label File
        input(name='img', enctype = "multipart/form-data", type='file')
    br
    input.btn.btn-primary(type='submit',value='Submit')

这是我的 article.pug 文件

extends layout

block content
  br
  h1= article.title
  //h5 Written by #{author}
  p= article.body
  img(src='{article.img}', alt='img')




  hr
  if user
    if user.id ==article.author
      a.btn.btn-default(href='/articles/edit/'+article._id) Edit 
      a.btn.btn-danger.delete-article(href='#',data-id=article._id) Delete

文件名未定义的问题已经解决,但现在我无法将我的 img 表示到我的文章页面。你能帮我解决这个问题吗?

【问题讨论】:

    标签: node.js mongodb image express multer


    【解决方案1】:

    在尝试访问其属性之前,您需要检查文件是否已上传。

    if (!req.file) {
       // return error response
    }
    let filename = req.file.filename
    

    你还需要验证请求的content-type是multipart/form-data

    【讨论】:

    • 是的,我做到了。它是多部分/形式
    【解决方案2】:

    你添加了吗

    enctype = "multipart/form-data" 
    

    以你的形式?

    这里是文档 https://www.npmjs.com/package/multer

    【讨论】:

    • 我的 add_article.pug 是:...... .file-field.input-field(method="post", enctype="multipart/form-data") .btn.grey span文件输入(name='img', enctype = "multipart/form-data", type='file') br...
    • 嘿,我编辑了它。你能再看一遍吗?(在主帖中)。
    【解决方案3】:

    你需要添加

    enctype = "multipart/form-data" 
    

    在表单标签中

    更改您当前的代码

      form(method='POST', action='/articles/add')
    
    

    进入

      form(method='POST', action='/articles/add', enctype = "multipart/form-data")
    
    

    并从输入文件中删除

    当前

    .file-field.input-field(method="post" , enctype="multipart/form-data")
          .btn.grey
            label File
            input(name='img', enctype = "multipart/form-data", type='file')
    

    改成

    .file-field.input-field(method="post")
          .btn.grey
            label File
            input(name='img', type='file')
    

    参考:https://www.npmjs.com/package/multer(参见基本用法)

    =====

    要在 html 中提供文件以供使用/调用,您需要从您的 express 路由它

    示例: 因为您的上传路径位于 /public/uploadss

    而您的 article.js 需要添加类似这样的代码

    router.use(express.static('public/uploadss'))
    

    注意:您的上传文件夹是uploadss,而不是uploads

    然后进行测试,您可以使用 url 打开浏览器并检查其是否有效

    http://localhost:PORT/filename.jpg

    你也可以创建虚拟路径前缀

    router.use('/static', express.static('public/uploadss'))
    

    这样你就可以访问它了 http://localhost:PORT/static/filename.jpg

    参考:https://expressjs.com/en/starter/static-files.html

    【讨论】:

    • 是的,它解决了未定义的问题,但我再次坚持在我的 article.pug 文件中表示图像。你能再看看我的主要帖子吗?因为我会添加 article.pug 文件。
    • 你能帮忙吗
    • @AlpErenGül 请检查我编辑的答案。这应该可以解决您的问题
    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 2018-07-21
    相关资源
    最近更新 更多