单独文件中的Express中间件(multer)
Express middleware (multer) in seperate file
我能够将一个非常简单的中间件(isAuthenticated)移到一个外部中间件文件中,但我在移动multer上传时遇到了困难。我刚刚学会了如何将它们移动到不同的文件中,所以这可能很直观。
routes/index.js
var middleware = require('../middleware/common');
var isAuthenticated = middleware.isAuthenticated;
var upload = middleware.multerSetup;
...
router.post('/updateuser',
upload,
...,
function (req, res, next) {
res.redirect('/dashboard');
}
);
--
//middleware/common.js
var multer = require('multer');
Middleware = {
//Checks whether user is logged in
isAuthenticated: function(req,res,next){
if(req.isAuthenticated()){
return next();
}
req.flash('auth',"You do not have the proper permissions to access this page");
res.redirect('/');
},
multerSetup: function(req,res,next){
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './public/uploads/')
},
//detects file type, then adds extension to match file type
filename: function (req, file, cb) {
var ext = "";
switch(file.mimetype){
case 'image/png':
ext = '.png';
break;
case 'image/jpeg':
ext = '.jpeg';
break;
default:
ext = '';
}
cb(null, Date.now() + ext); //Appending .jpg
}
});
var upload = multer({storage:storage, fileFilter: function (req, file, cb) {
var acceptedExt = ['.png','.jpg','.gif','.bmp'];
if (req.hasOwnProperty('file') && acceptedExt.indexOf(path.extname(file.originalname))=== -1) {
return cb(new Error('Image type not allowed: ' + path.extname(file.originalname)));
}
cb(null, true)
}});
return upload.single('upl');
}
};
module.exports = Middleware;
错误:
routes'index.js:108
upload.single('upl'),
^
TypeError: upload.single is not a function
at Object.<anonymous> (C:'Users'Tyler'WebstormProjects'volunteer'volunteerApp'routes'index.js:108:12)
您的multer中间件设置错误。您的Middleware.multerSetup
是一个中间件函数,然后它调用upload.single
来设置multer(然后它永远不会被调用,请求保持挂起状态)。将您的multer上传设置移到自定义中间件之外,并让您的模块仅从upload.single
导出返回函数。
示例:
Middleware = {
...
multerSetup: upload.single('upl')
...
}
明白了!只需要将routes/index.js中的上传定义为一个函数。
var upload = middleware.multerSetup();
Brother在单独的文件中,声明您的设置函数,然后声明您的中间件并导出它,并传递"文件";作为上传函数中的一个参数并返回上传。single(file):
const multer = require("multer");
function multerSetup() {
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "images");
},
filename: (req, file, cb) => {
cb(null, file.originalname);
},
});
return storage;
}
Middleware = {
upload: function (file) {
const upload = multer({ storage: multerSetup() });
return upload.single(file);
},
};
module.exports = Middleware;
在你的路线文件中写下你的路线:
const router = require("express").Router();
const Middleware = require("../helper/uploadImages");
router.post("/", Middleware.upload("file"), (req, res) => {
res.status(200).json("file has been uploaded!");
});
module.exports = router
在index.js文件中,您只需要导入您的路线并使用它:
const uploadImageRoute = require("./routes/uploadImages");
app.use("/api/upload", uploadImageRoute);
相关文章:
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 什么'在Express中路由时,应用程序级中间件和路由器级中间件之间的区别是什么
- Redux中间件在next()之前更改状态
- 快速的套接字 io 实例/中间件
- 如何使用Express'正确加载图像;s的静态中间件
- 如何在快递中制作中间件的动态链.js
- 在 Redux 中,在商店中应用中间件未正确称为化简器
- 意思是.JS中间件中的猫鼬填充不起作用
- "Cookies的这个实例“;在nodejs cookie中间件的源代码中
- Expressjs:如何跨路由共享路由中间件
- 如何在Keystone.js项目中使用Express.js中间件
- Express.js恶意路径中间件错误403
- 编写中间件'它不知道它在堆栈上的位置
- Router.use()需要中间件函数,但得到了一个未定义的函数
- webpack-dev中间件,如何在HMR失败时自动卸载
- Node js中间件,用于向mongo发出异步请求
- 如何在Express中获得POST字段,而不使用bodyParser中间件
- 谁在Express中间件中提供next()函数
- 由具有 multer 中间件的 Express 服务器接收的帖子数据将被截断
- 单独文件中的Express中间件(multer)