【发布时间】:2022-01-22 23:29:34
【问题描述】:
我想让我的后端接受并将文件直接上传到 mongodb。 我无法使用 multer 或强大的方法来实现这一点。
问题 1:我根本无法到达后端的正确端点。所有非多部分/表单数据端点都可以访问并正常工作。 问题2:如何正确配置它?我需要做什么才能将文件保存在内存中,然后将其插入 mongodb,最好不使用 moongoose(目前我不需要它)。
项目结构概览:
server.js
index.js
-api
--routes1.js
--routes2.js
...
-controllers
--route1.controller.js
--route2.controller.js
...
-dao
--route1DAO.js
--route2DAO.js
...
-middleware
--auth.js
依赖项(package.json):
"engines": {
"node": "^14.17",
"npm": "^6.14"
},
"dependencies": {
"bcryptjs": "^2.4.3",
"cors": "^2.8.5",
"dotenv": "^10.0.0",
"express": "^4.17.1",
"jsonwebtoken": "^8.5.1",
"mongodb": "^4.2.2",
"multer": "^1.4.4"
}
server.js:
import express from "express"
import cors from "cors"
import user from "./api/user.route.js"
import userprotected from "./api/userprotected.route.js"
import demo from "./api/demo.route.js"
import auth from "./middleware/auth.js"
import multer from "multer"
const app = express()
// Middleware
app.use(cors())
app.use(express.json())
app.use(express.urlencoded({extended: true}))
//app.use(multer) // not working --> Error: "requires middleware function"
// own public routes
app.use("/api/v1/user", user)
// own private routes
app.use("/api/v1/userprot", auth, userprotected)
app.use("/api/v1/demo", auth, demo)
[...]
app.use("*", (req,res) => res.status(404).json({error: "not found"}))
export default app
index.js:
import app from "./server.js"
import mongodb from "mongodb"
import dotenv from "dotenv"
import UserDAO from "./dao/userDAO.js"
[...]
dotenv.config()
const MongoClient = mongodb.MongoClient
const port = process.env.PORT || 5000
MongoClient.connect(
process.env.DEMO_DB_URI,
{
maxPoolSize: 50,
wtimeoutMS: 2500,
useNewUrlParser: true
}
)
.catch(err => {
console.error(err.stack)
process.exit(1)
})
.then(async client => {
await UserDAO.injectDB(client)
[...]
app.listen(port, () => {
console.log(`listening on port `+port)
})
})
我想通过邮递员到达的路线:
import express from "express"
import DemoCtrl from "demo.controller.js"
const router = express.Router()
router.route("/test").post(DemoCtrl.uploadTest)
export default router
我没有到达处理程序:
export default class DemoController{
static async uploadTest(req, res, next){
try {
console.log(req.file);
res.status(200).json({status: "demo"})
} catch (e) {
res.status(500).json({error: e})
}
}
}
这是我试图从 Postman 发送的内容,我检查了三次标头,并且一直运行到超时或错误 404。
我尝试“中间件”-ify 上传,但是无论我尝试调用它,它都会失败并出现超时错误;我确保我尝试上传的文件不超过限制。这是对应的代码。
import util from "util"
import Multer from "multer"
const maxSize = 2 * 1024 * 1024;
let processFile = Multer({
storage: Multer.memoryStorage(),
limits: { fileSize: maxSize },
}).single("file");
export default function(req, res){
return util.promisify(processFile);
}
如有任何提示或建议,我将不胜感激。我显然错过了一些东西。
【问题讨论】:
标签: node.js mongodb express ecmascript-6 multer