【问题标题】:Multer is uploading file, but not populating req.filesMulter 正在上传文件,但没有填充 req.files
【发布时间】:2018-07-23 11:10:21
【问题描述】:

我正在为一个学校项目研究 node.js,但我不知道为什么我的代码不起作用。每当我上传包含文本和文件的表单时,req.body 都会被填充,但 req.files 不会

server.js

const multer = require('multer')
const bparser = require('body-parser')

app.use(bparser.urlencoded(settings.body_parser))
...
let multer_storage = multer.diskStorage({
    destination: (req, file, cb) => { 
        cb(null, path.join(__dirname, settings.multer.destination))
    },
    filename: (req, file, cb) => {
        cb(null, Date.now() + path.extname(file.originalname))
    }
})

let multer_options = {
    storage: multer_storage,
    fileFilter: (req, file, cb) => {
        if (settings.multer.allowed_files.indexOf(file.mimetype) >= 0) 
            cb(null, true)

        cb(null, false)
    }
}

app.use(multer(multer_options).any())

app.use("*", (req, res, next) => {

    if (!req.session.user)
        if (req.cookies.user)
            req.session.user = req.cookies.user

    next()
})

for (let i = 0; i < settings.routes.length; i++) {
    app.use('/', require("./core/routers/" + settings.routes[i]))
}
...

./core/routers/post.js

const router = require('express').Router()
...
router.post('/post/share/', (req, res) => {

    let data = {
        title: req.body.title,
        user: req.session.user,
        post: req.files[0].path,
        tags: req.tags.split(" ")
    }

    post.create(data).then((result) => {
        return result
    })
})

我一直遇到“TypeError: Cannot read property 'path' of undefined”

【问题讨论】:

    标签: node.js express multer


    【解决方案1】:

    当您在 fileFilter 方法中调用 cb(null, false) 时,您告诉 multer 它不应该处理该文件,但它仍会进入您的中间件:req.filesundefined 这就是您收到该错误的原因.

    如果您不希望它在文件未处理的情况下进入您的中间件,那么您应该将错误传递给回调:

    let multer_options = {
        storage: multer_storage,
        fileFilter: (req, file, cb) => {
            if (settings.multer.allowed_files.indexOf(file.mimetype) >= 0) 
                return cb(null, true); // this return is missing
    
            cb(new Error('Invalid file'));
        }
    }
    

    无论如何,您在cb(null, true); 之前缺少return 语句,否则您将调用两次回调,一次使用true,另一次使用false


    总而言之,如果您不将Error 传递给fileFilter 函数,则应检查中间件中是否存在req.files

    【讨论】:

      【解决方案2】:

      或者你可以试试下面的代码:

      var tmp_path = req.file.path;
      

      【讨论】:

        猜你喜欢
        • 2018-06-10
        • 1970-01-01
        • 1970-01-01
        • 2019-02-10
        • 2020-10-02
        • 1970-01-01
        • 2017-11-24
        • 2020-01-24
        • 2016-10-30
        相关资源
        最近更新 更多