Multer 正在上传文件,但未填充 req.files
Multer is uploading file, but not populating req.files
我正在研究 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"
当您在 fileFilter
方法中调用 cb(null, false)
时,您告诉 multer 它不应该处理该文件,但它仍会进入您的中间件:req.files
是 undefined
这就是为什么会出现该错误。
如果您不希望它在文件未被处理的情况下进入您的中间件,那么您应该将错误传递给回调:
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
。
或者您可以试试下面的代码:
var tmp_path = req.file.path;
我正在研究 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"
当您在 fileFilter
方法中调用 cb(null, false)
时,您告诉 multer 它不应该处理该文件,但它仍会进入您的中间件:req.files
是 undefined
这就是为什么会出现该错误。
如果您不希望它在文件未被处理的情况下进入您的中间件,那么您应该将错误传递给回调:
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
。
或者您可以试试下面的代码:
var tmp_path = req.file.path;