'How can i upload audio file to Cloudinary with Node.js?

i deeply need help with this audio file upload to cloudinary issue I have had for several days now. I tried many times to make it work, but i am still struggling. I am a beginner backend developer, so please any help is appreciated.

It is an mp3 player App. When i upload a song, the title gets saved in DB, but the Audio isn't.

This is the MP3 PLAYER page screenshot. It shows the title being saved and rendered from DB but not the audio file.

Audio upload form

   <form class="ui form" action="/albums/<%= album._id %>/songs" method="POST" enctype="multipart/form-data">
            <div class="field">
                <label>Song Title:</label>
                <input type="text" id="title" name="song[title]" placeholder="song title...." required>
            </div>
            <div class="field">
                <label>Song file:</label>
                <input type="file" id="song" name="audio" accept="audio/*" required>
            </div>
            <div class="field">
                <input class="fluid ui green button" type="submit" id="submit" value="Enter">
            </div>
            <a href="/albums/<%= album._id %>" class="ui small orange button exit-btn">Exit</a>
     </form>

Song model

var mongoose = require("mongoose");

//Album Schema
var audioSchema = new mongoose.Schema({
   title: String,
   audio: String,
   date: {type: Date, default: Date.now()}

});

//exporting the Schema
module.exports = mongoose.model("Audio", audioSchema);

Backend code/ROUTE

var express             = require("express"),
    router              = express.Router({mergeParams: true}),
    middleware          = require("../middleware"),
    Album               = require("../models/album"),
    Song                = require("../models/songs"),
    multer              = require("multer")

var storage = multer.diskStorage({
  filename: function(req, file, callback) {
    callback(null, Date.now() + file.originalname);
  }
});
//uploader
var upload = multer({ storage: storage});
var cloudinary = require('cloudinary');
cloudinary.config({ 
   cloud_name: 'proccess.env.CLOUDINARY_NAME',
   api_key: process.env.CLOUDINARY_API_KEY, 
   api_secret: process.env.CLOUDINARY_API_SECRET
});

//Songs new Route
router.get("/albums/:id/songs/new", middleware.isLoggedIn, function(req, res) {
  //find Album by id
  Album.findById(req.params.id, function(err, album) {
      if(err) {
          console.log(err);
      } else {
          res.render("songs/new", {album: album});
      }
  });
});
//Song POST route
router.post("/albums/:id/songs", middleware.isLoggedIn, upload.single("audio"), function(req, res) {
    cloudinary.uploader.upload(req.file.path, function(result) {
        // add cloudinary url for the mp3 to the album object under audio property
        req.body.song.audio = result.secure_url;
        //find Album by ID
        Album.findById(req.params.id, function(err, album) {
            if(err) {
                console.log(err);
                res.redirect("/albums/" + req.params.id);
            } else {

                //Creating Album and saving it to DB
                Song.create(req.body.song, function(err, song) {
                    if(err) {
                        console.log("Opps something went wrong!" + err);
                        res.redirect("back");
                    } else {
                        //save the song to DB
                        song.save();
                        //this saves the songs object inside 
                        album.songs.push(song);
                        //save album
                        album.save();
                        res.redirect("/albums/" + album._id);
                    }
                });

            }

        });
    });    

});


module.exports = router;


Solution 1:[1]

  cloudinary.uploader.upload(req.file.path,  resource_type: "video", function(result)

Solution 2:[2]

That's because you will need to use GridFS from MongoDB to store data from a file. https://docs.mongodb.com/manual/core/gridfs/#use-gridfs

As you are using Mongoose, please check this module : https://www.npmjs.com/package/mongoose-gridfs

The mongoose-gridfs module wrap the gridfs-stream module, and seems to fit to binary data upload. If you want, you can still do it yourself, by following this tutorial : http://niralar.com/mongodb-gridfs-using-mongoose-on-nodejs/

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 dammika rajapaksha
Solution 2 Nicolas Frbezar