Моей первой попыткой было загрузить аудиофайл, и это было успешно, я использую mp3.single ('mp3File') как в документе, а затем я пытаюсь добавить другой файл, который является файлом изображения, поэтому я пытаюсь использовать multerполя, я не знаю, правильно ли я делаю, поэтому, пожалуйста, наведите меня на это,
И еще одна вещь, я пытаюсь сохранить файл как file.originalname, но это неt работать так
вот мой serve.js
require("dotenv").config();
const express = require("express");
const mongoose = require("mongoose");
const app = express();
const port = 3334 || 5000;
app.use(express.json());
app.use(express.static("public"));
const url = process.env.MONGO_URL;
mongoose.connect(url, { useCreateIndex: true, useNewUrlParser: true });
const db = mongoose.connection;
db.on("error", error => console.log(error));
db.once("open", () => console.log("Connected to database"));
const songRouter = require("./routes/song");
app.use("/song", songRouter);
// 400 Error setup
app.use((req, res, next) => {
const error = new Error("Not Found");
error.status(400);
next(error);
});
// ============================================= //
// 500 Error setup
app.use((error, req, res, next) => {
res.status(error.status || 500);
res.json({
error: {
message: error.message
}
});
});
app.listen(port, () => {
console.log(`Server is running on port: ${port}`);
});
модели
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const songSchema = new Schema({
song: { // name of song
type: String,
required: true
},
singer: { // names of singer
type: [String]
// type: Schema.Types.ObjectId,
// ref: "Singer"
},
featureSinger: {
type: [String]
// type: Schema.Types.ObjectId,
// ref: "Singer"
},
releaseDate: { // date of the song released
type: Date
},
mp3File: { // audio file
type: String,
required: true,
ref: "/public/mp3"
},
coverImage: { // image file
type: String,
required: true,
ref: "/public/cover"
}
});
const Song = mongoose.model("Song", songSchema);
module.exports = Song;
маршруты
const router = require("express").Router();
const multer = require("multer");
let Song = require("../models/song.models");
// mp3 file
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "./public/mp3/");
},
fileName: (req, file, cb) => {
cb(null, new Date().toISOString() + file.originalname);
// doesnt format as its originalname
}
});
const fileFilter = (req, file, cb) => {
if (file.mimetype === "audio/mpeg") {
cb(null, true);
} else {
cb(new Error("You can only upload mp3 file"), false);
}
};
const mp3 = multer({
storage: storage,
limits: {
fileSize: 1024 * 1024 * 10
},
fileFilter: fileFilter
});
// image file
const store = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "./public/cover/");
},
fileName: (req, file, cb) => {
cb(null, file.originalname);
// doesnt format as its originalname
}
});
const imageFilter = (req, file, cb) => {
if (file.mimetype === "jpeg/png") {
cb(null, true);
} else {
cb(new Error("You can only upload image file"), false);
}
};
const imageFile = multer({
storage: store,
fileFilter: imageFilter
});
const music = mp3.fields([{ name: "mp3File", maxCount: 1 }]);
const cover = imageFile.fields([{ name: "coverImage", maxCount: 1 }]);
router.post("/addGroupSinger", music, cover, async (req, res) => {
console.log(req.file);
const data = req.body;
const file = req.file;
const newSong = new Song({
song: data.song,
singer: data.singer,
featureSinger: data.featureSinger,
releaseDate: Date.parse(data.releaseDate),
mp3File: file.path,
coverImage: file.path
});
try {
let songAdded = await newSong.save();
res.status(201).json(songAdded);
} catch (err) {
res.status(400).json({ message: err.message });
console.log(err);
}
});
module.exports = router;
Я ожидаю сэкономитьоба файла в одном запросе, но в результате я получил неожиданное поле, СПАСИБО В ADVANCE ПАРНИ: D