【问题标题】:Multer destination file is not readable by ZEIT now现在 ZEIT 无法读取 Multer 目标文件
【发布时间】:2020-06-25 00:03:21
【问题描述】:

嗨,我尝试在我的 nodejs 应用程序中使用 multer 将图像上传到 cloudinary,它在 localhost 上完美运行,但是当我将它上传到 zeit 时它不起作用,它说“ENOENT:没有这样的文件或目录,打开(文件夹) " 我尝试使用 @now/static 使文件夹可用,但它也不起作用。如果你能帮助我,我会很高兴。

const express = require("express")
const multer = require("multer")
const cloudinary = require("cloudinary").v2
const cors = require("cors")

const config = require("../../config")
const response = require("../../network/response")
const Controller = require("./index")
const auth = require("./secure")

const router = express.Router()

cloudinary.config({
  cloud_name: config.cloudinary.name,
  api_key: config.cloudinary.api_key,
  api_secret: config.cloudinary.api_secret,
})

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, "./public/uploads")
  },
  filename: function (req, file, cb) {
    cb(null, file.originalname)
  },
})

const upload = multer({
  storage: storage,
  limits: { fileSize: 1024 * 1024 * 5 },
})

// Set routes
router.use(cors())
router.get("/", auth("list"), list)
router.post("/", auth("add"), upload.single("file"), upsert)

// Router Functions
function list(req, res, next) {
  Controller.list()
    .then((post) => {
      response.success(req, res, post, 200)
    })
    .catch(next)
}

function upsert(req, res, next) {
  const path = req.file.path
  const uniqueFilename = new Date().toISOString()

  cloudinary.uploader.upload(
    path,
    { public_id: `public/${uniqueFilename}` }, // directory and tags are optional
    function (err, image) {
      if (err) return res.send(err)
      console.log("file uploaded to Cloudinary")
      // remove file from server
      const fs = require("fs")
      fs.unlinkSync(path)
    }
  )

  Controller.upsert(req.body, uniqueFilename)
    .then((post) => {
      response.success(req, res, post, 201)
    })
    .catch(next)
}

module.exports = router

【问题讨论】:

    标签: javascript node.js vercel


    【解决方案1】:

    使用 Zeit/Vercel 时,您的 API 代码在 Lambda 中运行。 这个 lambda 在它完成执行时是一次性的, 因此,您在 API 中使用的文件系统会在上传执行结束时被销毁。

    (它在本地工作,因为最后没有人破坏您的计算机:D)。

    要使此方案正常工作,您需要将上传的文件写入持久性位置,例如 AWS S3。

    【讨论】:

      猜你喜欢
      • 2019-10-19
      • 2022-12-07
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 2016-05-21
      • 2017-09-02
      • 1970-01-01
      • 2016-07-06
      相关资源
      最近更新 更多