【问题标题】:How to upload any files to mongodb using Express, Multer, ES6, Router - without Moongoose?如何使用 Express、Multer、ES6、路由器将任何文件上传到 mongodb - 没有 Mongoose?
【发布时间】: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


    【解决方案1】:

    关于如何正确使用 multer 的例子有很多,这里有一个使用 express 的快速工作 sn-p:

    import express from "express";
    const app = express();
    const router = "import from file"
    app.use("/api/v1", router);
    
    const multer = require('multer');
    const storage = multer.memoryStorage();
    const upload = multer({storage: storage});
    
    import {Router} from 'express';
    
    const router = Router();
    
    fucntion uploadTest(req, res) {
       const buffer = req.file.buffer;
       // do whatever you want with the buffer
    }
    
    router.post('/test', upload.single('file'), uploadTest);
    
    export default router
    

    那么现在关于你的问题。

    问题 1: 这里没什么好说的,我不确定为什么你“无法到达正确的路线”,但在我的玩具示例中,你只需向/api/v1/test/ 发送一个post 请求,它应该可以工作。

    问题 2: 我不确定你为什么要将整个文件保存到 Mongo 中,但如果我要这样做,我只会获取缓冲区,将其转换为 base62 并将其作为长字符串保存在某个集合中。

    如果您打算使用 gridFS 之类的东西,而我个人对此没有任何经验,我选择将文件上传到 s3。

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 2016-03-19
      • 2021-06-07
      • 2017-06-05
      • 2013-02-11
      • 2017-01-04
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多