web-dev-qa-db-ja.com

ENOENT:そのようなファイルやディレクトリはありません。

これは、データとファイルの投稿中に取得するエラーです。私はRestful APIサービスを構築するための「academind」チュートリアルに従いました。また、このタイプのエラーの答えを探していましたが、私には何も機能しません。

「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;

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;
9
codedamn

product.js内

新しいDate()。toISOString() 追加の後ろ replace() 変化する 「:」

Windows OSファイルは受け入れません 「:」 名前付き

youtubeにはMAC OS

例えば

new Date()。toISOString()。replace(/:/ g、 '-')

25
Miles

以下を試してください:

  1. これを定数として要求する(const path = require( 'path');
  2. この行を変更

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

これとともに:

cb(null, path.join(__dirname, '/uploads/'));

私が見ることができるように、サーバー上で提供されていないパスではなく、サーバーマシン上にあるパスを取得しようとしています。

[〜#〜] update [〜#〜]

これも変更してみてください

app.use('/uploads', express.static('uploads'));

これに:

app.use(express.static(__dirname));

静的ファイルの__dirnameを公開するため。

4
Igor Dimchevski

これはコメントセクションで見つけました。 https://www.youtube.com/watch?v=srPXMt1Q0nY&list=PL55RiY5tL51q4D-B63KBnygU6opNPFk_q&index=10

ファイル作成段階で誰かがこれに問題を抱えている場合は、おそらくWindowsで作業していることを意味します。今、あなたは落胆したと感じてコンピュータをゴミ箱に捨てる必要はありません(私は実際に私のWindowsの回避策を常に見つけなければならないのが好きです:)。

少なくとも解決策があり、これが私が見つけたものです。私の問題は、Windowsがコロン( ':')を含むファイル名を受け入れないため、ファイルが作成されないことです。私の解決策はかなり単純です。現在の日付を取得したら、replace()と正規表現を使用してそれをダッシュ​​に変更します。ビオラ。できます!

念のため、これはそれを行う1つの方法です。filename:function(req、file、cb){const now = new Date()。toISOString(); const date = now.replace(/:/ g、 '-'); cb(null、date + file.originalname); }

それが窓で働いている人を助けることを願っています。

1
Jorge

すべて順調。問題はこの行にありますcb(null, new Date().toISOString() + file.originalname);単にcb(null,file.originalname);と書くだけで動作します。別の方法で使用して、ファイル名に日付文字列を追加してみてください。

0
satywan kumar