これは、データとファイルの投稿中に取得するエラーです。私は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;
product.js内
新しいDate()。toISOString() 追加の後ろ replace() 変化する 「:」
Windows OSファイルは受け入れません 「:」 名前付き
youtubeにはMAC OS
例えば
new Date()。toISOString()。replace(/:/ g、 '-')
以下を試してください:
この行を変更
cb(null、 './uploads/');
これとともに:
cb(null, path.join(__dirname, '/uploads/'));
私が見ることができるように、サーバー上で提供されていないパスではなく、サーバーマシン上にあるパスを取得しようとしています。
[〜#〜] update [〜#〜]
これも変更してみてください
app.use('/uploads', express.static('uploads'));
これに:
app.use(express.static(__dirname));
静的ファイルの__dirnameを公開するため。
これはコメントセクションで見つけました。 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); }
それが窓で働いている人を助けることを願っています。
すべて順調。問題はこの行にありますcb(null, new Date().toISOString() + file.originalname);
単にcb(null,file.originalname);
と書くだけで動作します。別の方法で使用して、ファイル名に日付文字列を追加してみてください。