ENOENT:没有这样的文件或目录.

cod*_*amn 9 node.js express multer

这是发布数据和文件时发生的错误.我已经遵循'academind'教程来构建Restful API服务,我也一直在寻找这类错误的答案,但对我来说没有任何作用.

我使用"multer"上传文件

文件夹中的文件夹"上传"但显示

ENOENT:没有这样的文件或目录,打开'D:\ project\uploads\2018-01-24T07:41:21.832Zcheck.jpg'"

app.js

const express = require("express");
const app = express();
const morgan = require("morgan");
const bodyParser = require("body-parser");
const mongoose = require("mongoose");

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

mongoose.connect('',
(err)=>{
    if(err){console.log(err)}
    else{console.log('DB Connected')}
})
mongoose.Promise = global.Promise;

app.use(morgan("dev"));
app.use('/uploads', express.static('uploads'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use((req, res, next) => {
  res.header("Access-Control-Allow-Origin", "*");
  res.header(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept, Authorization"
  );
  if (req.method === "OPTIONS") {
    res.header("Access-Control-Allow-Methods", "PUT, POST, PATCH, DELETE, GET");
    return res.status(200).json({});
  }
  next();
});

// Routes which should handle requests
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) => {
  res.status(error.status || 500);
  res.json({
    error: {
      message: error.message
    }
  });
});

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

product.js

const express = require("express");
const router = express.Router();
const mongoose = require("mongoose");
const multer = require('multer');

const storage = multer.diskStorage({
  destination: function(req, file, cb) {
    cb(null, './uploads/');
  },
  filename: function(req, file, cb) {
    cb(null, new Date().toISOString() + file.originalname);
  }
});

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: storage,
  limits: {
    fileSize: 1024 * 1024 * 5
  },
  fileFilter: fileFilter
});

router.post("/", checkAuth, upload.single('productImage'), (req, res, next) => {
  const product = new Product({
    _id: new mongoose.Types.ObjectId(),
    name: req.body.name,
    price: req.body.price,
    productImage: req.file.path 
  });
  product
    .save()
    .then(result => {
      console.log(result);
      res.status(201).json({
        message: "Created product successfully",
        createdProduct: {
            name: result.name,
            price: result.price,
            _id: result._id,
            request: {
                type: 'GET',
                url: "http://localhost:3000/products/" + result._id
            }
        }
      });
    })
    .catch(err => {
      console.log(err);
      res.status(500).json({
        error: err
      });
    });
});

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

Mil*_*les 26

在product.js中

new Date().toISOString()后面添加replace()更改":"

Windows操作系统文件不接受":"命名

在youtube上是MAC OS

例如

new Date().toISOString().replace(/:/ g,' - ')

  • 这次真是万分感谢。有同样的问题,这为我解决了 (4认同)

Igo*_*ski 12

请尝试以下操作:

  1. 要求将其作为常量(const path = require('path');
  2. 改变这一行

    cb(null, './uploads/');

有了这个:

cb(null, path.join(__dirname, '/uploads/'));
Run Code Online (Sandbox Code Playgroud)

正如我所看到的,您正在尝试获取不在服务器上提供的路径,而是在服务器计算机上的路径。

更新

也尝试改变这个

app.use('/uploads', express.static('uploads'));
Run Code Online (Sandbox Code Playgroud)

对此:

app.use(express.static(__dirname));
Run Code Online (Sandbox Code Playgroud)

为了公开静态文件的 __dirname。

  • 非常感谢你。为我节省了很多时间的压力。添加 next(null, path.join(__dirname, '.././public/uploads/images/')); 工作过 (3认同)

Tar*_*rei 7

所以答案就在 youtube 的教程评论部分。代替:

cb(null, new Date().toISOString() + file.originalname);
Run Code Online (Sandbox Code Playgroud)

做:

cb(null, Date.now() + file.originalname);
Run Code Online (Sandbox Code Playgroud)

简单如。


Kev*_*evz 6

这对我有用。我将“./uploads/”更改为“__dirname”,以便它可以在计算机上的任何位置找到正确的目录/文件名。

const storage = multer.diskStorage({
  destination: function(req, file, cb) {
    cb(null, __dirname);
  },
  filename: function(req, file, cb) {
    cb(null, new Date().toISOString() + file.originalname);
  }
});
Run Code Online (Sandbox Code Playgroud)

因为当您设置特定的文件夹名称/目录时,您将图像目录限制为仅或应该位于该文件夹中。