How do I POST data into MongoDB database using node.JS?

16,533

Solution 1

A quick reminder, the post() method just gets the data from the <form> you specify. For you to be able to get that data you'd have to do something like this.

app.js

const express = require('express)
const mongoose = require('mongoose)

var app = express()

mongoose.connect('mongodb://localhost:"yourPortHere"/"mongoDBhere"')

Now post needs the body parser in order to be able to retrieve the data and sort of "translate it" to JS, for that you need the body parser.

app.use(bodyParser.urlencoded({extended: false})) //Post Body Parser

Now let's get to the post

app.post("/action", (req, res) => {
var userData = {
    username: req.body.username,
    password: req.body.password
}

For the moment userData is going to hold the data you just retrieved from the <form> Remember that action="/YourActionHere is the identifier for the app.post("/YourActionHere") so those two have to match, otherwise you will not get the data.

To save it to MongoDB you first need to create a model of the object you want to store, if MongoDB has a Database named movies with a directory named films on it you first have to create a Model named film since mongoose will save it in the directory films (<- By directory I mean collection)

So: in folder Models you create a model of the object

const mongoose = require('mongoose')
const Schema = mongoose.Schema
var film = new Schema({
title: String,
year: String,
director: String 
 })
module.exports = mongoose.model("movie", movieSchema)

To be able to use that new Schema you have to import it in you app.js with

var Film = require('pathToFilmSchema')

Now in your post you will save userData to that Schema, and mongoose will store it in the collection specified in its .js.

app.post("/action", (req, res) => {
 var userData = {
    title: req.body."name",
    year: req.body."name",
    director: req.body.""
}
new Film(userData)
})

If the structure is the same de Data in that variable will be stored in a Schema, then you just have to call the method .save(), which you can call right after like this

newFil(userData)
.save()

Now mongoose will store a new object with film Schema into the database you have connected at the top. Keep in mind that, if you don't have a collection named film mongoDB will create one collection named films (the plural, always) and store the Schema there.

After saving you can res.redirect() to "/" or render another page, that's up to you.

Solution 2

You have posted to url users/submit but i don't see any API for users/submit . You have said to use users for /users urls but have you defined the /submit within /users?

You could go through this Routing in expressjs

Share:
16,533
lc1993
Author by

lc1993

Updated on June 14, 2022

Comments

  • lc1993
    lc1993 almost 2 years

    the code below is pretty messy so don't judge too much! I am trying to POST a basic user profile into my database, i don't think i am far off but i keep getting a 404.

    im pretty knew to all of these technologies so could somebody please enlighten me as to what i have done wrong.

    node.js POST method

    var express = require('express');
    var router = express.Router();
    var mongo = require('mongodb');
    var assert = require('assert');
    var url = 'mongodb://localhost:27017/local';
    
    /* GET home page. */
    router.get('/', function(req, res, next) {
        res.render('signIn', { title: 'signIn' });
    });
    
    router.get('/getData', function(req, res, next){
        mongo.connect(url, function (err, db) {
    
            assert.equal(null, error);
            var cursor = db.collection('userData').find();
            cursor.forEach(function(doc, err){
                assert.equal(null, err);
                resultArray.push(doc);
            }, function() {
                db.close();
                res.render('index', {items: resultArray});
            } );
        });
    });
    
    router.post ('/insert', function(req,res,next) {
        var item = {
            email: req.body.email,
            firstName: req.body.firstName,
            lastName: req.body.lastName,
            password: req.body.password
        };
        mongo.connect(url, function (err, db) {
            assert.equal(null, err);
            db.collection('userData').insertOne(item, function (err, result) {
                assert.equal(null, err);
                console.log('item has been inserted');
                db.close;
            });
        });
    
        res.redirect('/');
    });
    module.exports = router;
    

    form HTML

    <!DOCTYPE html>
    <html lang="en">
    <head>
    
    
        <title>SignIn Page</title>
        <link rel="stylesheet" type="text/css" href="/stylesheets/signIn.css"/>
    
    
    </head>
    
    <body>
    
    <div class="background">
    
    
    <div class="loginFormWrapper">
        <form action="/users/submit" method="POST">
            <div class="loginForm">
                <label for="firstName">First name:</label>
                <input type="text" class="form-control" id="firstName" name="firstName" placeholder="first name">
    
                <label for="lastName">Last name:</label>
                <input type="text" class="form-control" id="lastName" name="lastName" placeholder="last name">
    
                <label for="email">Email address:</label>
                <input type="email" class="form-control" name="email" id="email" placeholder="email">
    
            </div>
            <div class="form-group">
                <label for="pwd">Password:</label>
                <input type="password" class="form-control" name="password" id="password" placeholder="password">
            </div>
            <div class="checkbox">
                <label><input type="checkbox"> Remember me</label>
            </div>
            <button type="submit" class="btn btn-default">Submit</button>
    
        </form>
        <form action="users" method="GET">
            <button type="submit" class="btn btn-default">get result</button>
        </form>
    </div>
    
    </div>
    
    
    </body>
    </html>
    

    App.js

        var express = require('express');
    
        var path = require('path');
        var favicon = require('serve-favicon');
        var logger = require('morgan');
        var cookieParser = require('cookie-parser');
        var bodyParser = require('body-parser');
        var validate = require('form-validate');
        var mongoose = require('mongoose');
    
    
    
    
        var index = require('./routes/index');
        var users = require('./routes/users');
        var About = require('./routes/about');
        var signIn = require('./routes/signIn');
        var contact = require('./routes/contact');
    
    
        var app = express();
    
    
    
    
        // view engine setup
        app.set('views', path.join(__dirname, 'views'));
        app.set('view engine', 'ejs');
    
        // uncomment after placing your favicon in /public
        //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
        app.use(logger('dev'));
        app.use(bodyParser.json());
        app.use(bodyParser.urlencoded({ extended: true }));
        app.use(bodyParser.json());
        app.use(cookieParser());
        app.use(express.static(path.join(__dirname, 'public')));
        app.use('/', index);
        app.use('/users', users);
        app.use('/About', About);
        app.use('/signIn', signIn);
        // app.use('/contact', contact);
    
    
    
    
    
    
    
    //catch 404 and forward to error handler
    app.use(function(req, res, next) {
      var err = new Error('Not Found');
      err.status = 404;
      next(err);
     });
    
    // error handler
    app.use(function(err, req, res, next) {
      // set locals, only providing error in development
      res.locals.message = err.message;
      res.locals.error = req.app.get('env') === 'development' ? err : {};
    
      // render the error page
      res.status(err.status || 500);
      res.render('error');
    });
    
    module.exports = app;
    

    user.js

    var express = require('express');
    var app = require("mongoose");
    var router = express.Router();
    
    
    /* GET users listing. */
    router.get('/', function(req, res, next) {
      res.send('respond with a resource');
    });
    
    module.exports = router;