Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ENOENT: no such file or directory .?

This is error which am getting while post data and file. I have followed 'academind' tutorial for building Restful API services, also i have been searching answer for this type of errors but nothing works for me.

Am using "multer" to upload file

The folder 'uploads' available in the folder but it shows

ENOENT: no such file or directory, open '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;
like image 564
codedamn Avatar asked Jan 24 '18 09:01

codedamn


People also ask

How do I fix error Enoent No such file or directory?

To resolve the ENOENT warning message, you need to add a package. json file in the directory where you run the npm install command. And then run your npm install command again. This time, the warning message should not appear.

What does error Enoent mean?

It's an abbreviation of Error NO ENTry (or Error NO ENTity), and can actually be used for more than files/directories. It's abbreviated because C compilers at the dawn of time didn't support more than 8 characters in symbols. Follow this answer to receive notifications. edited Jun 4, 2019 at 14:30. community wiki.

What is npm err code Enoent?

The code ENOENT means that npm fails to open a file or directory that's required for executing the command. The npm start command is used to run the start script in the package.


16 Answers

in product.js:

After new Date().toISOString() add replace() to change ":" to an accepted character.

Windows OS doesn't accept files with a ":"

The person on Youtube is using MAC OS

E.g

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

like image 76
Miles Avatar answered Oct 04 '22 15:10

Miles


Try the following:

  1. Require this as a constant (const path = require('path');)
  2. Change this line

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

With this:

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

As I can see, you are trying to get a path that is not on served on the server, but rather a path that is on the server machine.

UPDATE

Try also changing this

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

To this:

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

In order to expose the __dirname for static files.

like image 37
Igor Dimchevski Avatar answered Oct 04 '22 13:10

Igor Dimchevski


This what worked for me. I changed './uploads/' into '__dirname' so that it can find the correct directory/filename anywhere on your computer.

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

Because when you set a specific folder name/directory you limit your image directory to be only or should be in that folder.

like image 31
Kevz Avatar answered Oct 04 '22 15:10

Kevz


So the answer is in the tutorials comments section on youtube. Instead of:

cb(null, new Date().toISOString() + file.originalname);

do:

cb(null, Date.now() + file.originalname);

Simple as.

like image 45
Tarasi Cristi Andrei Avatar answered Oct 04 '22 13:10

Tarasi Cristi Andrei


I am doing the same course and I too had the same problem (i also use windows machine). The following worked for me:

const hash = require('random-hash'); // you have to install this package:

const fileStorage = multer.diskStorage({
    destination: (req, file, callback) => { //this is storing the file in the images folder
        callback(null, path.join(__dirname, '/Images'));
    },

    filename: (req, file, callback) => { //this is just setting a unique filename
        let temp = file.originalname.split('.');
        const filename = temp[0] + '-' + hash.generateHash({length: 5}) + '.' + temp[1]
        callback(null, filename);
    }
});

This creates a unique hash for the filenames as well

like image 39
Srivatsa Avatar answered Oct 04 '22 15:10

Srivatsa


I found this in the comments section, here: https://www.youtube.com/watch?v=srPXMt1Q0nY&list=PL55RiY5tL51q4D-B63KBnygU6opNPFk_q&index=10

OK guys, in case someone has an issue with this in the file creation stage, that probably means you're working on Windows. Now, you don't need to feel discouraged and throw your computer to the trash (I actually like always having to find workarounds for my Windows :).

There's at least a solution, and this is the one I found. My problem is the file does not get created because Windows does not accept filenames with colon (':') on it. My solution is rather simple. After I get the current date, I use replace() and a regexp to change that into a dash. Viola. It works!

Just in case, this is one way to do it: filename: function(req, file, cb){ const now = new Date().toISOString(); const date = now.replace(/:/g, '-'); cb(null, date + file.originalname); }

Hope it helps someone who´s working in windows.

like image 37
Jorge Avatar answered Oct 04 '22 15:10

Jorge


I came across the same error while saving the file. The path I provided in callback didn't exist already that's why I got that error

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

With filesystem I created the same folder, In case of folder exists the err gets value but here nothing to worry about as we have that folder. This worked for me. hope this would help

like image 40
Devashish Avatar answered Oct 04 '22 15:10

Devashish


every thing is fine. problem is on this line cb(null, new Date().toISOString() + file.originalname); simply write cb(null,file.originalname); it will work. try to use in different way to add the date string with file name.

like image 27
satywan kumar Avatar answered Oct 04 '22 13:10

satywan kumar


I had a similar error and this is how I resolved it. After using the replace method, I changed './uploads/images/' to 'uploads/images'. In this case, multer created the folder automatically. So you have something like this

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

For Windows users.

like image 30
Gbless Sylva Avatar answered Oct 04 '22 14:10

Gbless Sylva


You don't have permission to access /uploads/ on this server.

Try the following:

sudo chmod -R 777 /uploads
like image 44
Chaman Yadav Avatar answered Oct 04 '22 14:10

Chaman Yadav


You should change the file name. Because ':' is not allowed in Windows.

Eg:

const storage = multer.diskStorage({
    destination: function(req, file, cb){
        cb(null,'./uploads/');
    },
    filename: function(req,file,cb){
        cb(null, new Date().toISOString().replace(/:/g, '-') +'-'+ file.originalname);
    }
});
like image 40
Sumith Ekanayake Avatar answered Oct 04 '22 13:10

Sumith Ekanayake


I think if you work with Windows OS, you should use another methods of Date().i write code like this:

filename:(req,file,cb)=>{ cb(null,new Date().toDateString()+file.originalname) }
like image 33
Negin msr Avatar answered Oct 04 '22 13:10

Negin msr


create folder uploads near app.js file

for this line

app.use('/uploads', express.static('uploads'));
like image 21
iman roosta Avatar answered Oct 04 '22 15:10

iman roosta


if this can't find a folder then you can create one

destination: function(req, file, cb) {
    fs.mkdir('./uploads/',(err)=>{
       cb(null, './uploads/');
    });
  },
like image 44
MD SHAYON Avatar answered Oct 04 '22 15:10

MD SHAYON


use this = > cb(null, Date.now() + file.originalname); instead of cb(null, new Date().toISOString() + file.originalname); to prevent "error": "ENOENT: no such file or directory

like image 30
Sajjan Shah Avatar answered Oct 04 '22 13:10

Sajjan Shah


This error occurs because ./uploads/ does not exist.

FYI : If you use multer like below

const upload = multer({ dest: 'uploads' })

This creates uploads directories at server starting.

but if we use destination object then it does not create directory.

Proof/ref: https://www.npmjs.com/package/multer#diskstorage https://www.npmjs.com/package/multer#diskstorage

Solution

const fs = require('fs'); // Added to create directories
const multer = require('multer');

const storage = multer.diskStorage({
  destination: function(req, file, cb) {
    // :::::::::::::::Create diretories:::::::::::::::::::
    fs.mkdir('./uploads/',(err)=>{
       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
});
like image 26
Abhishek Kumar Avatar answered Oct 04 '22 13:10

Abhishek Kumar