JSON POST requests empty response on Mongo - html

I'm try to post From HTML Form To MongoDB Atlas and following the tutorial.
used:
express js
body-parser
mongoose
I can create a request but no content.
I have no clue where's the problem.
I'm supposed to show the document in MongoDB Atlas
{
"_id": "a13d1s2bc12as3a2",
"name": "Name",
"password": "password",
"_v": 0
}
but now like this:
{
"_id": "a13d1s2bc12as3a2",
"_v": 0
}
I can connect the mongoDB.
Here my code:
const express = require("express");
const app = express();
const mongoose = require("mongoose");
const bodyParser = require("body-parser");
const urlencoded = require("body-parser/lib/types/urlencoded");
app.use(bodyParser.urlencoded({extended: true}));
//connect mongodb
mongoose.connect("mongodb+srv://comp3421:password#cluster.o06sg.mongodb.net/db", {useNewUrlParser: true, useUnifiedTopology: true})
//create dataSchema
const notesSchema = {
username:String,
password:String
}
const Note = mongoose.model("Note", notesSchema);
//get function
app.get("/", function(req, res){
res.sendFile(__dirname + "/try.html");
})
//insert into mongodb
app.post("/", function(req, res){
let newNote = new Note({
username: req.body.username,
password: req.body.password
});
newNote.save();
res.redirect('/');
})
app.listen(3000, function(){
console.log("server is running on 3000")
})
This part is try.html and the main part of the html:
<form action="/" method="post" enctype="multipart/form-data">
<div class="f input">
<label>Username</label>
<input type="text" name="username">
</div>
<div class="f input">
<label>Password</label>
<input type="password" name="password" >
</div>
<div>
<input type="submit" value="Create account">
</div>
</form>

You need to parse request body.
You have to mention below line.
app.use(bodyParser.json());

Related

MySQL store "Undefined" string in nodejs multipart/form-data?

js application with mysql server in my app I want to store the filename of the image at the same time the image file will store to my project folder. I am using this multer framework to upload my file yes I have successfully stored the image file in my project folder /uploads. But sadly MySQL wont allow me to send the data it will only store "undefined" string. How can we possibly fix this?
<form class="add-music-form" action="/save" method="POST" enctype="multipart/form-data">
<div class="form-group">
<div class="song-feaured-image">
<input style="display: none;" type="file" accept="image/*" id="file" name="featured_img" onchange="loadFile(event)" required>
<img id="output" class="image-preview" width="130" src="/img/rock-on.jpg" />
<label for="file" class="attach_file" style="cursor: pointer">
<i class="material-icons">attach_file</i></label>
</div>
</div>
<div class="form-group">
<input type="text" class="form-control" placeholder="Title" id="title" name="title" required>
</div>
<div class="form-group">
<input type="text" class="form-control" placeholder="Band name" id="band_name" name="band_name" required>
</div>
<div class="custom-file">
<input type="file" class="custom-file-input" id="customFile" name="audio" required>
<label class="custom-file-label" for="customFile">Select audio file</label>
</div>
<div class="mt-3">
<button type="submit" class="btn btn-primary">Submit</button>
<a onclick="cancel()" class="btn btn-default">Cancel</a>
</div>
</form>
app.js
const path = require('path');
const express = require('express');
const multer = require('multer');
const ejs = require('ejs');
const bodyParser = require('body-parser');
const mysql = require('mysql');
const app = express();
const DIR = './assets/uploads/featured-img';
// Set Database Connection
const connection=mysql.createConnection({
host:'localhost',
user:'root',
password:'',
database:'nodejs_crud'
});
connection.connect(function(error){
if(!!error) console.log(error);
else console.log('Database Connected!')
});
let storage = multer.diskStorage({
destination: function (req, file, callback) {
callback(null, DIR);
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
}
});
let upload = multer({storage: storage});
//set view file
app.use(express.static('assets'));
//set view engine
app.set('view engine', 'ejs');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extend: false}));
app.get('/',(req, res) => {
let sql = "SELECT * FROM music"
let query = connection.query(sql, (err, rows) => {
if(err) throw err;
res.render('music_index');
});
});
app.post('/save',upload.single('featured_img'), function (req, res) {
let sql = "INSERT INTO `music`(`featured_img`, `title`, `band_name`, `audio`) VALUES ('" + req.body.featured_img + "', '"+req.body.title+"', '"+req.body.band_name+"', '"+req.body.audio+"')";
let query = connection.query(sql, (err, results) => {
if(err) throw err;
res.redirect('/');
});
});
// Server Listening
const port = 3000;
app.listen(port, () => console.log(`Server started on port ${port}`));
Here's an example of a single file being uploaded. To upload multiple files in the same form you'll need to use upload.array instead of upload.single:
/views/music_index.ejs:
<form class="add-music-form" action="/save" method="POST" enctype="multipart/form-data">
<div class="form-group">
<div class="song-feaured-image">
<input style="display: none;" type="file" accept="image/*" id="file" name="featured_img" required>
<img id="output" class="image-preview" width="130" src="/img/rock-on.jpg" />
<label for="file" class="attach_file" style="cursor: pointer">
<i class="material-icons">attach_file</i></label>
</div>
</div>
<div class="form-group">
<input type="text" class="form-control" placeholder="Title" id="title" name="title" required>
</div>
<div class="form-group">
<input type="text" class="form-control" placeholder="Band name" id="band_name" name="band_name" required>
</div>
<div class="mt-3">
<button type="submit" class="btn btn-primary">Submit</button>
<a onclick="cancel()" class="btn btn-default">Cancel</a>
</div>
</form>
app.js:
const path = require('path');
const express = require('express');
const multer = require('multer');
const ejs = require('ejs');
const bodyParser = require('body-parser');
const mysql = require('mysql');
const app = express();
// Ensure this folder exists
const DIR = './assets/uploads/featured-img';
let storage = multer.diskStorage({
destination: function (req, file, callback) {
callback(null, DIR);
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
}
});
let upload = multer({storage: storage});
app.use(express.static('assets'));
app.set('view engine', 'ejs');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extend: false}));
app.get('/',(req, res) => {
res.render('music_index');
});
app.post('/save',upload.single('featured_img'), function (req, res) {
let sql = "INSERT INTO `music`(`featured_img`, `title`, `band_name`, `audio`) VALUES ('" + req.file.path + "', '"+req.body.title+"', '"+req.body.band_name+"', '"+req.body.audio+"')";
console.log(sql);
});
const port = 3000;
app.listen(port, () => console.log(`Server started on port ${port}`));

Cannot POST /ha use more then one FORM

I was trying to send more then one FORM, but I get an error.
The first FORM works the second one doesn't. It's the same form.
The second one gives me an error Cannot POST /ha
<body>
<form action="/ha" method="post">
<input type="text" name="user">
<input type="submit" value="Senden">
</form>
<form action="/Gehalt" method="post">
<input type="text" name="user">
<input type="submit" value="Senden">
</form>
</body>
this is my test.js
const sqlite3 = require('sqlite3').verbose();
const express = require('express');
const bodyParser = require('body-parser')
var app = express();
let Gehalt
let r
app.use(bodyParser.urlencoded({
extended: true
}));
let db = new sqlite3.Database('memory.sqlight3', sqlite3.OPEN_READWRITE, (err) => {
if (err) {
console.error(err.message);
}
console.log('Connected to the chinook database.');
});
app.get('/', function(req, res) {
res.sendFile(__dirname + '/test.html');
});
app.post('/ha', function(req, res) {
console.log("Yout got it");
r = req.body.user;
var stmt = db.prepare('INSERT INTO lorem (Salary) VALUES(?);');
stmt.run(r);
stmt.finalize();
db.close();
});
app.post('/Gehalt', function(req, res) {
console.log("Yout got it");
r = req.body.user;
var stmt = db.prepare('INSERT INTO lorem (Outgoings) VALUES(?);');
stmt.run(r);
stmt.finalize();
db.close();
});
app.listen(3100, function() {
console.log('GO to Port 3100');
});
What did I do wrong?

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

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;
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.
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
Inside your app.post function you should have something like this:
let MongoClient = require('mongodb').MongoClient;
let connectionUrl = "mongodb://localhost:27017/";
// or
// let connectionUrl = "mongodb+srv://<username>:<password>#<your-cluster-url>/test?retryWrites=true&w=majority";
// creating the message object
let obj = {"text" : "Something"};
console.log("OBJ: " + obj);
MongoClient.connect(connectionUrl, function(err, client) {
if (err) throw err;
console.log("Connected correctly to server");
// if database and collection do not exist they are created
var db = client.db('YourDatabase')
db.collection("YourCollection").insertOne(obj, function(err, res) {
if (err) throw err;
console.log("1 message inserted");
client.close();
});
});

How to send the response to the same html page after clicking submit button using node.js

Onclick of submit button,I'm redirecting the data "name" to this url http://localhost:3000/getfileNames.But, now I'm trying to get the data "name" to same html page(http://localhost:3000/login).Can anyone please help me out regarding this ...
My sample.html:
<html>
<head>
</head>
<h1>
Login
</h1>
</head>
<body>
<div id="formContainer">
<form method="post" action="/getfileNames">
Name: <input type="text" name="name" id="name" placeholder="name"> <br><br>
Password: <input type="text" name="pwd" id="pwd" placeholder="password"> <br><br>
<input type="submit" name="submit" value="submit" />
</form>
</div>
</body>
</html>
My index.js:
var express = require('express');
var router = express.Router();
router.get("/login", function(req, res)
{
res.sendFile("login.html", {"root": __dirname});
});
router.post('/getfileNames', function(req, res) {
console.log(req.body.name);
res.send('Name: ' + req.body.name);
});
module.exports = router;
If you want to build some kind of auth, I suggest to use server-side template system e.g. Jade.
So your code would be like:
var express = require('express');
var router = express.Router();
router.get("/", function(req, res)
{
if(req.user)
res.render('index', {user: req.user.name})
else res.redirect('/login');
});
router.get('/login', function(req, res) {
res.render('login');
});
router.post('/login', function(req, res) {
/* Log user in, set cookies, whatever */
res.redirect('/');
});
In top of the app you have to use some some auth middleware (e.g. passport.js or write it by yourself).
Of course, you can just make AJAX to get user name but I don't think it's a good solution in this case.
UPDATE
If you just want to show some text you stored on server.
index.js
<html>
<head>
</head>
<h1>
Login
</h1>
</head>
<body>
<p id="savedName"></p>
<div id="formContainer">
<form>
Name: <input type="text" name="name" id="name" placeholder="name"> <br><br>
Password: <input type="text" name="pwd" id="pwd" placeholder="password"> <br><br>
<button name="submit" value="submit" id="btn"/>
</form>
</div>
</body>
</html>
client.js
$(function(){
$.get('/name').done(fucntion(name){ $('#savedName').text(name) }).fail(alert);
$('#btn').click(function(){
var name = $('#name').val();
var pwd = $('#pwd').val();
$.post('/name', {name: name, pwd: pwd}).done(fucntion(){ $('#savedName').text(name) }).fail(alert);
})
})
server.js
var express = require('express');
var router = express.Router();
var name = "";
router.get("/", function(req, res)
{
res.sendFile("login.html", {"root": __dirname});
});
router.get('/name', function(req, res) {
res.send(name);
});
router.post('/name', function(req, res) {
name = req.body.name;
res.senStatus(200);
});

Connect html contact us form with expressjs server side

Hi I'm new in web development I'm trying to write the backend code for contact us form but it keep giving me error:
My Html code for contact us form:
</div>
<div class="row">
<div class="col-sm-8">
<div class="contact-form">
<h2 class="title text-center">Get In Touch</h2>
<div class="status alert alert-success" style="display: none"></div>
<form id="main-contact-form" class="contact-form row" name="contact-form" method="post">
<div class="form-group col-md-6">
<input type="text" name="name" class="form-control" required="required" placeholder="Name">
</div>
<div class="form-group col-md-6">
<input type="email" name="email" class="form-control" required="required" placeholder="Email">
</div>
<div class="form-group col-md-12">
<input type="text" name="subject" class="form-control" required="required" placeholder="Subject">
</div>
<div class="form-group col-md-12">
<textarea name="message" id="message" required="required" class="form-control" rows="8" placeholder="Your Message Here"></textarea>
</div>
<div class="form-group col-md-12">
<input type="submit" name="submit" class="btn btn-primary pull-right" value="Submit">
</div>
</form>
</div>
</div>
and my backend code is
var express = require('express');
var logger = require('morgan');
var bodyParser = require('body-parser');
var pjs = require('ejs');
var nodemailer = require('nodemailer');
var router = express.Router();
var app = express();
// Middleware
app.set('view engine', 'ejs');
app.use(express.static('public'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.get('/', function(req, res) {
// database query
res.render('index');
});
app.get('/blog-single.html', function(req, res) {
// database query
res.render('blog-single');
});
app.get('/blog.html', function(req, res) {
// database query
res.render('blog');
});
app.get('/cart.html', function(req, res) {
// database query
res.render('cart');
});
app.get('/checkout.html', function(req, res) {
// database query
res.render('checkout');
});
app.get('/contact-us.html', function(req, res) {
// database query
res.render('contact-us');
});
router.post('/contact-us.html :contact-form', function(req, res) {
var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: 'abm.rizk#gmail.com', // Your email id
}
})
});
app.get('/index.html', function(req, res) {
// database query
res.render('index');
});
app.get('/login.html', function(req, res) {
// database query
res.render('login');
});
app.get('/product-details.html', function(req, res) {
// database query
res.render('product-details');
});
app.get('/shop.html', function(req, res) {
// database query
res.render('shop');
});
app.get('/*', function(req, res) {
// database query
res.render('404');
});
app.listen(8080, function(err) {
if (err) {
console.log("Error");
} else {
console.log("Running on port 8080");
}
})
This is my full backend code and html i just post the contact us form so basically my problem is with
router.post('/contact-us.html :contact-form', function(req,res){
var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: 'abm.rizk#gmail.com', // Your email id
}
})
});
In the console there is no error but one I browse :
My form:
but once I click submit :
The path of route is wrong. Alter to:
router.post('/contact-us', function(req,res){
var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: 'abm.rizk#gmail.com', // Your email id
}
})
});
I noticed this problem on their routes, but it still does not work, post the console error output.