All my projects were working fine before but all of sudden the content of the body is not being saved as if the body is not being parsed or something. Just to check I created this simple project of book directory but no luck.
Any help would be appreciated.
Thank you
app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var mongoose = require('mongoose');
var config = require('./config');
// import bodyParser from "body-parser";//for typscript code only, use require for js
// app.use(bodyParser.json());
// app.use(bodyParser.urlencoded({ extended: false }));
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var bookRouter = require('./routes/books_routes');
const url = config.mongoURL;
const connect = mongoose.connect(url);
connect.then((DB)=>{
console.log("Connected With the MongoDB Server");
},(err)=>{next(err)})
.catch((err)=>next(err));
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(logger('dev'));
app.use(cookieParser());
app.use(express.json());
app.use(express.urlencoded({
extended: true
})); //Parse URL-encoded bodies
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/books',bookRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// 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;
Route File
const express = require('express');
const mongoose =require('mongoose');
const Books = require('../models/books');
const bookrouter = express.Router();
// bookrouter.use(bodyparser.json());
bookrouter.use(express.json());
bookrouter.use(express.urlencoded({
extended: true
})); //Parse URL-encoded bodies
bookrouter.route('/')
.get((req,res,next)=>{
Books.find({})
.then((books)=>{
res.statusCode = 200;
res.setHeader('content-Type','application/json');
res.json(books);
},(err)=>{next(err)})
.catch((err)=>next(err))
})
.post((req,res,next)=>{
var book = new Books({
book_name: req.body.book_name,
book_author: req.body.book_author,
book_description: req.body.book_description
})
book.save()
.then((book)=>{
Books.findById(book._id)
.then((book)=>{
res.statusCode = 200;
res.setHeader('content-type','application/json');
res.json(book);
},(err)=>next(err))
})
})
.put((req,res,next)=>{
res.send("PUT request is not supported at this API");
})
.delete((req,res,next)=>{
Books.remove({})
.then((resp)=>{
res.statusCode=200;
res.setHeader('content-type','application/json');
res.send(resp);
})
})
module.exports = bookrouter;
Model file
const mongoose = require('mongoose');
var Schema = mongoose.Schema;
var passportlocalmongoose = require('passport-local-mongoose');
var Books = new Schema({
book_name :{
type:String
},
book_author:{
type:String
},
book_description:{
type:String
}
},{
timestamps:true
})
Books.plugin(passportlocalmongoose);
module.exports = mongoose.model('Book',Books);
package.json
{
"name": "books-directory",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"body-parser": "^1.19.0",
"cookie-parser": "~1.4.4",
"debug": "~2.6.9",
"express": "~4.16.1",
"http-errors": "~1.6.3",
"jade": "~1.11.0",
"mongodb": "^3.0.10",
"mongoose": "^5.1.7",
"mongoose-currency": "^0.2.0",
"morgan": "~1.9.1",
"passport": "^0.4.0",
"passport-local": "^1.0.0",
"passport-local-mongoose": "^5.0.1"
}
}
Related
I created a express app and having some big issues:
My routing is horrendous and can't get my 'Signin' and 'Signup' pages connecting to my home page. Some advice would be really helpful. (I've attached an image of my tree structure)
I'm also getting a error - throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn))
My app.js
// define dependencies
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 session = require('express-session');
var passport = require('passport');
var ejs = require('ejs');
var ExpressValidator = require('express-validator');
var LocalStrategy = require('passport-local').Strategy;
var multer = require('multer');
//handle file uploads
var upload = multer({des: './uploads'});
var flash = require('connect-flash');
var mongo = require('mongodb');
var mongoose = require('mongoose');
var db = mongoose.connection;
// const PORT = 5500; // you can change this if this port number is not available
const router = express.Router();
var routes = require('./routes/index');
var users = require('./routes/users');
// app.use('/', routes);
// app.use('/users', users);
var app = express();
//view engine setup
app.use('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.static(path.join(__dirname, 'public')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cookieParser());
// Handle Sessions
app.use(session({
secret: 'secret',
saveUninitialized: true,
resave: true
}));
//passport middleware
app.use(passport.initialize());
app.use(passport.session());
//Express Validator middleware
app.use(ExpressValidator({
errorFormatter: function(param, msg, value){
var namespace = param.split('.'),
root = namespace.shift(),
formParam = root;
while(namespace.length){
formParam += '[' + namespace.shift() + ']';
}
return {
param : formParam,
msg : msg,
value : value
};
}
}));
//express messages middleware
app.use(require('connect-flash')());
app.use(function (req, res, next) {
res.locals.messages = require('express-messages')(req, res);
next();
});
//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 handlers
//development error handler
//will print stacktrace
if (app.get('env') === 'development'){
app.use(function(err, req, res, next){
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
//production erro handler
//no stacktraces leaked to user
app.use(function(err, req, res, next){
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
// //connect to database
// mongoose.connect('mongodb://localhost:27017/auth_tuts', { //replace this with you
// // useMongoClient: true
// }, (err, db) => {
// if (err) {
// console.log("Couldn't connect to database");
// } else {
// console.log(`Connected To Database`);
// }
// }
// );
module.exports = app;
My user.js
var express = require('express');
const router = express.Router();
// GET home page.
router.get('/', function (req, res, next) {
res.send('respond with a resource');
});
router.get('/signup', function (req, res, next) {
res.render('signup');
});
module.exports = router;
My index.js
var express = require('express');[enter image description here][1]
var router = express.Router();
// GET home page.
router.get('/', function(req, res, next){
res.render('index', { title: 'Express' });
});
module.exports = router;
my package.json file
{
"name": "project",
"version": "1.0.0",
"description": "College Project",
"main": "app.js",
"scripts": {
"start": "node ./bin/www"
},
"repository": {
"type": "git",
"url": "git+https://github.com/KevinKerin/kjs-webdesign.git"
},
"author": "Johnathan Munster",
"license": "ISC",
"bugs": {
"url": "https://github.com/KevinKerin/kjs-webdesign/issues"
},
"homepage": "https://github.com/KevinKerin/kjs-webdesign#readme",
"dependencies": {
"bcrypt": "^3.0.2",
"body-parser": "^1.18.3",
"connect-flash": "*",
"cookie-parser": "*",
"debug": "*",
"ejs": "^2.6.1",
"express": "^4.16.4",
"express-messages": "*",
"express-session": "^1.15.6",
"express-validator": "*",
"jsonwebtoken": "^8.4.0",
"mongodb": "*",
"mongoose": "^5.3.12",
"morgan": "*",
"multer": "*",
"nodemailer": "^4.6.8",
"nodemailer-smtp-transport": "^2.7.4",
"passport": "*",
"passport-http": "*",
"passport-local": "*",
"serve-favicon": "*",
"shortid": "^2.2.14"
}
}
File Structure
Issue fixed. I had .use instead of .set(‘views’, path...)
Working on my routing now.
Given is:
/routes/index.js
var express = require('express');
var router = express.Router();
//var mongo = require('mongodb').MongoClient;
//var objectId = require('mongodb').ObjectID;
var mongo = require('mongodb');
var assert = require('assert');
var url = 'mongodb://localhost:27017/test';
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index');
});
router.post('/insert', function(req, res, next) {
var item = {
title: req.body.title,
content: req.body.content,
author: req.body.author
};
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 inserted');
db.close();
});
});
res.redirect('/');
});
app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var hbs = require('express-handlebars');
var expressValidator = require('express-validator');
var expressSession = require('express-session');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var app = express();
// view engine setup
app.engine('hbs', hbs({extname: 'hbs', defaultLayout: 'layout', layoutsDir: __dirname + '/views/layouts/'}));
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public'))); eingetragen)
app.use(expressValidator());
app.use(express.static(path.join(__dirname, 'public')));
app.use(expressSession({secret: "eefa56_50cacb_34634f", saveUninitialized: false, resave: false})); // dafault storage is RAM, otherwise kann ich in der API von express-session rumwühlen, da der storage serverseitig in einer DB erfolgt
app.use('/', indexRouter);
app.use('/users', usersRouter);
...
package.json
{
"name": "sample_express_app(POST_GET_handlebars)",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"assert": "^1.4.1",
"body-parser": "^1.18.3",
"cookie-parser": "~1.4.3",
"debug": "~2.6.9",
"express": "~4.16.0",
"express-handlenter": "^3.0.0",
"express-session": "^1.15.6",
"express-validator": "^5.3.0",
"http-errors": "~1.6.2",
"mongodb": "^3.1.4",
"morgan": "~1.9.0"
}
}
The mongoDB server is running and there is no issue to manipulate the database in the CMD. It especially deals with the router.post('/insert' ... in /routes/index.js. There is something wrong(but maybe at another point too).
I also tried it with this (either I get the error db.collection('userdata').insert(... --> 'db.collection is not a function' or db.userdata.insert(... --> 'cannot read property insert'):
1)
db.runCommand({
insert: "userdata",
documents: [ item ]
}
)
2)
db.collection('userdata').insertOne(item, function(err, result) {
assert.equal(null, err);
console.log('Item inserted');
db.close();
});
3)
db.userdata.insert(item, function(err, result) {
assert.equal(null, err);
console.log('Item inserted');
db.close();
});
Native mongoDB driver works with the help of MongoClient.
Make changes in the index.js file
var mongo = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017';
mongo.connect(url, function(err, client) {
const db = client.db(dbName);
//your db queries
})
refer mongodb
Have a problem with using another method in class.
I'm working with express framework and have to use Ecma Script 6.
When I try to use method in the same class I have an error:
Cannot read property 'generatePassword' of undefined
TypeError: Cannot read property 'generatePassword' of undefined
at createUser (E:\OpenServer\domains\testNode\app\controllers\users.js:5:13)
at Layer.handle [as handle_request] (E:\OpenServer\domains\testNode\node_modules\express\lib\router\layer.js:95:5)
at next (E:\OpenServer\domains\testNode\node_modules\express\lib\router\route.js:131:13)
at Route.dispatch (E:\OpenServer\domains\testNode\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (E:\OpenServer\domains\testNode\node_modules\express\lib\router\layer.js:95:5)
at E:\OpenServer\domains\testNode\node_modules\express\lib\router\index.js:277:22
at Function.process_params (E:\OpenServer\domains\testNode\node_modules\express\lib\router\index.js:330:12)
at next (E:\OpenServer\domains\testNode\node_modules\express\lib\router\index.js:271:10)
at Function.handle (E:\OpenServer\domains\testNode\node_modules\express\lib\router\index.js:176:3)
at router (E:\OpenServer\domains\testNode\node_modules\express\lib\router\index.js:46:12)
My code:
Route: /routes/users.js
const express = require('express');
const router = express.Router();
const users = require('../app/controllers/users');
router.get('/', users.createUser);
module.exports = router;
Controller: /app/controllers/users.js
class Users
{
createUser(req, res)
{
this.generatePassword();
res.json({msg: "The method return user data" });
}
generatePassword()
{
return 'The method return new password';
}
}
module.exports = new Users();
Main App file: /app.js
const express = require('express');
const path = require('path');
const favicon = require('serve-favicon');
const logger = require('morgan');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const index = require('./routes/index');
const users = require('./routes/users');
const app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');
// 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: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', index);
app.use('/users', users);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
let 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;
package.json
{
"name": "testnode",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"body-parser": "~1.15.2",
"cookie-parser": "~1.4.3",
"debug": "~2.2.0",
"express": "~4.14.0",
"hbs": "~4.0.1",
"morgan": "~1.7.0",
"serve-favicon": "~2.3.0"
}
}
Help me please, thank you.
In the line that causes the error, the object this is not what you think it is. To solve this, replace the following:
router.get('/', users.createUser);
with:
router.get('/', users.createUser.bind(users));
This will make sure when eventually that function is called by the router.get implementation, it will be called with the this object set to users.
I'm building an app with node/express/mongo/mongoose. I've encountered an error that I can't seem to figure out and googling around has so far not been helpful.
I've created a simplistic, cat-themed example to recreate the error I'm encountering. I'm basically trying to retrieve an object by its ObjectId. I'm using the object id (as a string) that was automatically generated when I created the object.
When I navigate to the path localhost:3000/kitty/586d62878fc14d30e0ac5379 I get the following error: 'Cast to ObjectId failed for value "586d62878fc14d30e0ac5379" at path "_id" for model "Kitten"'. The offending line of code is my call to model.Kitten.findById() [see below].
As far as I can tell, the ObjectId string is valid.
I've tried casting my string object id to a mongoose object id and passing this in to findById instead of the string value, but this only produces a strange "hex is not a function" error, and besides, I am under the impression that this is unnecessary because mongoose automatically casts a valid string id to an object id.
I'm using a hosted mongodb instance (mlab).
Here is my code for reference:
Package.json:
{
"name": "testapp",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"body-parser": "~1.15.2",
"cookie-parser": "~1.4.3",
"debug": "~2.2.0",
"express": "~4.14.0",
"jade": "~1.11.0",
"mongodb": "^2.2.19",
"mongoose": "^4.7.6",
"morgan": "~1.7.0",
"serve-favicon": "~2.3.0"
}
}
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 index = require('./routes/index');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
// 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: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', index);
app.use('/users', users);
// 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;
index.js:
var express = require('express');
var router = express.Router();
var model = require('./model');
var mongoose = require('mongoose');
/* GET home page. */
router.get('/kitty/create', function(req, res, next) {
var fluffy = new model.Kitten({ name: 'fluffy' });
fluffy.save(function(err, fluffy){
if(err) return next(err);
res.render('index', { title: 'Express' });
});
});
router.get('/kitty/:id', function(req, res, next){
// find kitty by id
model.Kitten.findById(req.params.id, function(err, kitty){
if(err) return next(err);
if(!kitty){
res.send('no kitty found');
} else {
res.send(kitty._id);
}
});
});
module.exports = router;
model.js:
var mongoose = require('mongoose');
mongoose.connect('mongodb://xxxxx:xxxxx#xxxxx.mlab.com:xxxxx/xxxxx');
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
var kittySchema = mongoose.Schema({
name: String
});
var Kitten = mongoose.model('Kitten', kittySchema);
exports.Kitten = Kitten;
});
Any insight you can offer would be greatly appreciated.
I was having the exact same problem. There seems to be an issue with mongoose version. I downgraded from 4.7.6 to 4.7.2 (the last version I was using before upgrading) and no more problem.
I don't know exactly in which version the problem was introduced, but based on the absence of answers when googling, maybe it's 4.7.6 (released on 2017-01-02).
Just doing
npm install --save mongoose#4.7.2
will fix it for now.
Hope this helps :)
Edit:
It's definitely a bug on versions after 4.7.2
https://github.com/Automattic/mongoose/issues/4867#issuecomment-270342054
Iam getting following error if I try to open the localhost:3000 or localhost:3000/login. Can someone help me what is the problem? It is very strange. Many thanks
My Code
var express = require('express');
var crypto = require('crypto');
var bodyParser = require('body-parser');
var flash = require('connect-flash');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var path = require ('path');
var port = process.env.PORT || 3000;
var MongoClient = require('mongodb').MongoClient,
ObjectID = require('mongodb').ObjectID,
url = require('url');
var db;
//var mongo;
//var collection;
//dataExt = require('./routes/serverExtend');
// setup middleware
var app = express();
app.use(bodyParser());
app.use(flash());
app.use(cookieParser('secret'));
app.use(session({cookie: { secret: 'keyboard cat', maxAge: 60000 }}));
app.use(express.static(__dirname + 'public')); //setup static public directory
app.set('views', __dirname + 'testapp/views'); //optional since express defaults to CWD/views
app.set('view engine', 'ejs');
// Start server
app.listen(port);
console.log('App started on port ' + port);
// Initialize connection once
MongoClient.connect("mongodb://localhost:27017/testDB", function(err, database) { //"mongodb://localhost:27017/test"
if(err) throw err;
db = database;
});
app.get('/', function(req, res) {
res.render('index.ejs', { message: req.flash('signupMessage')}); // load the index.ejs file
app.get('/login', function(req, res) {
res.render('login.ejs');
});
Here is my package.json
{
"name": "NodejsStarterApp",
"version": "0.0.1",
"description": "A sample nodejs"
"dependencies": {
"express" : "~4.0.0",
"ejs" : "*",
"mongodb":"*",
"connect-flash" : "~0.1.1",
"morgan": "~1.0.0",
"body-parser": "*",
"cookie-parser": "~1.0.0",
"express-session": "~1.0.0"
},
"engines": {
"node": "0.10.26"
},
"repository": {}
}
Here is the problem.
change this line
app.set('views', __dirname + 'testapp/views');
to
app.set('views', __dirname + 'views');
Because when you say just __dirname + 'views' it looks in {appName}/views/fileToRender. But because you are saying __dirname + 'testapp/views' it will search {appName}/testapp/views/fileToRender.