Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js eNote:没有这样的文件或目录。?_Node.js_Express_Multer - Fatal编程技术网

Node.js eNote:没有这样的文件或目录。?

Node.js eNote:没有这样的文件或目录。?,node.js,express,multer,Node.js,Express,Multer,这是我在发布数据和文件时遇到的错误。 我遵循了“Academicind”教程来构建Restful API服务,我也一直在寻找这类错误的答案,但对我来说什么都不管用 我使用“multer”上传文件 文件夹“上载”在文件夹中可用,但它显示 eNote:没有这样的文件或目录,请打开“D:\project\uploads\2018-01-24T07:41:21.832Zcheck.jpg” app.js const express = require("express"); const app = ex

这是我在发布数据和文件时遇到的错误。 我遵循了“Academicind”教程来构建Restful API服务,我也一直在寻找这类错误的答案,但对我来说什么都不管用

我使用“multer”上传文件

文件夹“上载”在文件夹中可用,但它显示

eNote:没有这样的文件或目录,请打开“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;
请尝试以下操作:

sudo chmod -R 777 /uploads
  • 要求将其作为常量(constpath=Require('path');
  • 换行

    app.use('/uploads', express.static('uploads'));
    
    cb(空“./上传/”)

  • 为此:

    cb(null, path.join(__dirname, '/uploads/'));
    
    正如我所看到的,您试图获取的路径不是服务器上提供的路径,而是服务器机器上的路径

    更新

    试着改变这个

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

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

    为了公开静态文件的_udirname。

    我在评论部分找到了它,这里:

    好的,伙计们,万一有人在文件创建过程中遇到问题 在舞台上,这可能意味着你正在使用Windows。现在,你没有 需要感到气馁,把你的电脑扔进垃圾桶(I 实际上就像总是要为我的Windows找到解决方法一样:)

    至少有一个解决方案,这就是我找到的,我的问题 由于Windows不接受,因此无法创建文件 带有冒号(“:”)的文件名。我的解决方案相当简单。之后 我得到当前日期,我使用replace()和regexp来更改它 冲刺,中提琴,很管用

    以防万一,这是一种方法: 文件名:函数(请求、文件、cb){ const now=new Date().toISOString(); const date=now.replace(/:/g,'-'); cb(空,日期+文件.originalname);}

    希望它能帮助在windows中工作的人。

    在product.js中:

    new Date().toISOString()之后添加
    replace()
    将“:”更改为可接受的字符

    Windows操作系统不接受带有“:”的文件

    Youtube上的人正在使用MAC OS

    例如


    new Date().toISOString().replace(/:/g,“-”)
    一切正常。问题出在这一行
    cb(null,new Date().toISOString()+file.originalname);
    只需编写
    cb(null,file.originalname);

    它将起作用。请尝试以不同的方式添加带有文件名的日期字符串。

    您没有访问/上载/此服务器的权限

    请尝试以下操作:

    sudo chmod -R 777 /uploads
    

    这对我很有用。我将“/uploads/”改为“\uuu 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);
      }
    });
    

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

    所以答案在youtube上的教程评论部分。 而不是:

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


    简单如。

    您应该更改文件名。因为Windows中不允许使用“:”

    例如:


    我在保存文件时遇到了相同的错误。 我在回调中提供的路径不存在,这就是我出错的原因

    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);
      }
    });
    
    对于文件系统,我创建了相同的文件夹,如果文件夹存在,err会得到值,但这里没有什么需要担心的,因为我们有那个文件夹。
    这对我很有用。希望这会有所帮助。我认为如果你使用Windows操作系统,你应该使用另一种方法
    Date()。我写这样的代码:

    filename:(req,file,cb)=>{ cb(null,new Date().toDateString()+file.originalname) }
    

    我有一个类似的错误,我就是这样解决的。在使用replace方法后,我将“/uploads/images/”更改为“uploads/images”。在这种情况下,multer会自动创建文件夹。因此,您有类似的情况

    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);
          }
      });
    

    适用于Windows用户。

    创建文件夹上载app.js文件附近的文件

    这条线

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

    我正在学习同样的课程,我也有同样的问题(我也使用windows机器)。以下几点对我很有用:

    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);
        }
    });
    
    

    这将为文件名创建一个唯一的哈希值。注意:为了删除所有特殊字符,我们可以使用replace函数作为

    const cleanVariable = mixSpecialCharters.replace(/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '');
    
    const cleanVariable=mixSpecialCharters.replace(/[`~!@$%^&*()u124;+\-=?;:'”,.\{\\\[\]\/]/gi,);
    
    使用this=>cb(null,Date.now()+file.originalname);而不是cb(null,new Date().toISOString()+file.originalname);阻止
    “错误”:“eNote:没有这样的文件或目录

    如果找不到文件夹,您可以创建一个

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

    我添加了“cb(null,'D:/project/uploads');”但仍然没有使用“D:/project/uploads”,请使用_dirname全局对象。同样的错误,console.log(_dirname)results D:\projects错误一定在express的某个地方。static无法承载静态文件的文件夹非常感谢。为我节省了很多时间的压力。添加下一步(null,path.join(uu dirname,.././public/uploads/images/);根据,文件名中不允许使用冒号(
    )。请尝试删除它(product.js
    中的第11行)。谢谢。我也遇到了同样的问题,这为我解决了。是的……我花了一个小时才弄清楚文件夹应该已经存在,然后它才保存文件。谢谢。它正在工作。你也可以使用节点内置的加密库来生成哈希。因此,你不必再添加其他依赖项。
    crypto.randomBytes(16)。toString(“十六进制”)
    ->此位将生成哈希值并添加更多详细信息