【发布时间】:2018-09-24 15:25:58
【问题描述】:
我正在编写一个 Express 应用程序,为了避免弄乱我的 routes.js 文件,我创建了一个单独的 UploadController,如下所示:
// UploadController.js
const multer = require('multer')
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'public/' + file.fieldname + '/')
},
filename: function (req, file, cb) {
cb(null, Date.now() + '-' + file.originalname)
}
})
const upload = multer({
storage: storage
})
module.exports = {
upload
}
我在routes这样使用,具体来说这只是我的注册路线作为例子:
app.post('/register',
RegistrationPolicy.validate,
UploadController.upload.single('avatar'),
UserController.register)
这工作得很好。理想情况下,我需要在上传运行之前检查请求类型是否为multipart/form-data,然后在上传完成后运行:
req.body.avatarUri = req.file.destination + req.file.filename
这样当UserController.register运行时,上传文件的URI就会存储在我的数据库中。
我能想到的最简洁的方法是在我的控制器中创建一个自定义的upload 方法,该方法执行检查、上传操作,然后是 URI 分配。问题是,将 multer 放在这样的函数中间:
async upload (req, res, next, field) {
// ...check request type...
multerUpload.single(field)
// ...assign URI...
next()
}
给我Error: Route.post() requires a callback function but got a [object Promise]
是否可以按照我描述的方式使用 multer?谁能指出我可能会误解什么?我是 Node+Express 的新手,所以如果我错过了一些需要的信息,请告诉我。
【问题讨论】:
-
你为什么使用
async函数? Express 中间件模式需要function(request, response, nextCallback){}。此外,您提供的函数签名将被视为error middleware,因为它有 4 个参数。你能展示更多你的路由器吗?
标签: javascript node.js express multer