问题
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;
回答1:
in product.js
new Date().toISOString() Behind add replace() change ":"
Windows OS file don't accept ":" named
on youtube is the MAC OS
E.g
new Date().toISOString().replace(/:/g, '-')
回答2:
Try the following:
- Require this as a constant (const path = require('path');)
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.
回答3:
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.
回答4:
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.
回答5:
You don't have permission to access /uploads/ on this server.
Try the following:
sudo chmod -R 777 /uploads
来源:https://stackoverflow.com/questions/48418680/enoent-no-such-file-or-directory