"message": "ENOENT:没有那个文件或目录,打开'E:\\astrology\\utils\\uploads\\1600798534862qf.png'"

bub*_*ord 0 node.js express multer

正如标题所暗示的,error: {"message": "ENOENT: no such file or directory, open 'E:\\astrology\\utils\\uploads\\1600798534862qf.png'"}即使在通过了所有必需的配置之后,我还是会进入我的项目。

注意:我将“app”分为两部分:主要的“app.js”和“appRoute.js”是为了更动态和更清晰的代码。

应用程序.js

const express = require("express");
const path = require("path");

const app = express();
const directory = path.join(__dirname, "utils/uploads");
app.use("/uploads", express.static(directory));

require("./config/database/db")();
require("./config/approutes/appRoutes")(app);

module.exports = app;
Run Code Online (Sandbox Code Playgroud)

appRoute.js

require("dotenv").config();

const morgan = require("morgan");
const bodyParser = require("body-parser");
const cors = require("cors");

const productRoutes = require("../../api/routes/products");

module.exports = function (app) {
  app.use(morgan("dev"));

  app.use(bodyParser.urlencoded({ extended: true, limit: "100mb" }));
  app.use(bodyParser.json());

  app.use(cors({ credentials: true, origin: true }));

  app.use("/products", productRoutes);
  
  app.use((req, res, next) => {
    const error = new Error("Not found");
    error.status = 404;
    next(error);
  });

  app.use((error, req, res, next) => {
    console.log('SHOW ERROR', error);
    
    res.status(error.status || 500);
    res.json({
      error: {
        message: error.message,
      },
    });
  });
};
Run Code Online (Sandbox Code Playgroud)

文件上传.js

const multer = require("multer");

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, __dirname + "/uploads");
  },
  filename: function (req, file, cb) {
    cb(null, Date.now() + file.originalname.replace(/\s+/g, "-"));
  },
});

const fileFilter = (req, file, cb) => {
  // reject a file
  if (file.mimetype === "image/jpeg" || file.mimetype === "image/png") {
    cb(null, true);
  } else {
    cb(null, false);
  }
};

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

module.exports = upload;
Run Code Online (Sandbox Code Playgroud)

Product.js(控制器)

exports.create_product = async (req, res, next) => {
  const { title, min_content, content } = req.body;

  console.log("req files", req.files);

  try {
    const product = new Product({
      title,
      min_content,
      content,
    });

    const new_product = await product.save();
    console.log("error caught", new_product);

    if (new_product) {
      res.status(201).json({ msg: "New product added", new_product });
    } else {
      res.status(400).json({ msg: "Unable to create new product" });
    }
  } catch (error) {
    res.status(500).json({ msg: "Internal server error", error });
  }
};
Run Code Online (Sandbox Code Playgroud)

Product.js(路由)

const express = require("express");
const router = express.Router();

const ProductController = require("../controllers/products");
const uploadMW = require("../middleware/fileUpload");

router.get("/all", ProductController.get_products);
router.post("/new", uploadMW.fields([{ name: "thumbnail" }, { name: "image" }]), ProductController.create_product
);

module.exports = router;
Run Code Online (Sandbox Code Playgroud)

目录结构

目录结构

我的操作系统是 windows,所以我已经包含了从文件名替换 (:) 的配置,但似乎没有任何东西对我有用。任何解决相同问题的帮助表示赞赏。

Ary*_*rya 5

app.js 文件将是这样的

// modules =================================================
var express = require('express');
var app = express();
const logger = require('morgan');
var bodyParser = require('body-parser');
const indexRouter = require("./routes/index");
const cors = require('cors');
const path = require("path");
config = require("./environments/index");
var http = require('http').Server(app);

// configuration ===========================================
var port = config.PORT || 8081; // set our port

app.use(bodyParser.json({ limit: '50mb' }));

app.use(bodyParser.urlencoded({
limit: '50mb',
extended: true,
parameterLimit: 50000
}));
app.use(cors());
app.use(logger('dev'))
app.use("/api", indexRouter);

app.use(express.static(path.join(__dirname, "/build")));

http.listen(port, () => {
   console.log('Magic happens on port ' + port); // shoutout to the user
});

exports = module.exports = app;
Run Code Online (Sandbox Code Playgroud)

在您的应用程序中创建 multerhelper.js 文件并在其中添加以下代码

const multer = require('multer');

// const fs = require('fs');
let fs = require('fs-extra');

let storage = multer.diskStorage({
destination: function (req, file, cb) {
   let path = `/uploads`;
   fs.mkdirsSync(path);
   cb(null,  __dirname + path);
},
filename: function (req, file, cb) {
   // console.log(file);

 cb(null, Date.now() + file.originalname.replace(/\s+/g, "-"));
}
})

 var upload = multer({ storage: storage });

 let createUserImage = upload.single('images');


 let multerHelper = {
 createUserImage,

 }

 module.exports = multerHelper;
Run Code Online (Sandbox Code Playgroud)

在您的product.js(路由)文件中导入此文件

  const multerhelper = require("../multerhelper.js");  
  router.post("/new",multerhelper.createUserImage,ProductController.
  create_product);
Run Code Online (Sandbox Code Playgroud)