3

i'm trying to get some data from the apiRoutes.get('/resources/productinfo/:name') and i have this error, i dont know whats going wrong... also the apiRoutes.get('/book/:title') doesnt seems to work! i dont know what am i doing wrong

UPDATED:

>       TypeError: Cannot read property &#39;findOne&#39; of undefined <br> &nbsp; &nbsp;at Object.module.exports.findBookByTitle
> (/home/themis/firstapp/api/config/database.js:22:26) <br> &nbsp;
> &nbsp;at /home/themis/firstapp/api/server.js:109:22 <br> &nbsp;
> &nbsp;at Layer.handle [as handle_request]
> (/home/themis/firstapp/api/node_modules/express/lib/router/layer.js:82:5)
> <br> &nbsp; &nbsp;at next
> (/home/themis/firstapp/api/node_modules/express/lib/router/route.js:100:13)
> <br> &nbsp; &nbsp;at Route.dispatch
> (/home/themis/firstapp/api/node_modules/express/lib/router/route.js:81:3)
> <br> &nbsp; &nbsp;at Layer.handle [as handle_request]
> (/home/themis/firstapp/api/node_modules/express/lib/router/layer.js:82:5)
> <br> &nbsp; &nbsp;at
> /home/themis/firstapp/api/node_modules/express/lib/router/index.js:234:24
> <br> &nbsp; &nbsp;at param
> (/home/themis/firstapp/api/node_modules/express/lib/router/index.js:331:14)
> <br> &nbsp; &nbsp;at param
> (/home/themis/firstapp/api/node_modules/express/lib/router/index.js:347:14)
> <br> &nbsp; &nbsp;at Function.proto.process_params
> (/home/themis/firstapp/api/node_modules/express/lib/router/index.js:391:3)
> <br> &nbsp; &nbsp;at
> /home/themis/firstapp/api/node_modules/express/lib/router/index.js:228:12
> <br> &nbsp; &nbsp;at Function.match_layer
> (/home/themis/firstapp/api/node_modules/express/lib/router/index.js:295:3)
> <br> &nbsp; &nbsp;at next
> (/home/themis/firstapp/api/node_modules/express/lib/router/index.js:189:10)
> <br> &nbsp; &nbsp;at
> /home/themis/firstapp/api/node_modules/express/lib/router/index.js:191:16
> <br> &nbsp; &nbsp;at Function.match_layer
> (/home/themis/firstapp/api/node_modules/express/lib/router/index.js:295:3)
> <br> &nbsp; &nbsp;at next
> (/home/themis/firstapp/api/node_modules/express/lib/router/index.js:189:10)

here is the server.js

  var express     = require('express');
        MongoClient = require('mongodb').MongoClient,
        app = express(),
        mongoUrl = 'mongodb://localhost:27017/firstapp';
    var bodyParser  = require('body-parser');
    var morgan      = require('morgan');
    var mongoose    = require('mongoose');
    var passport    = require('passport');
    var redisClient = require('redis').createClient;
    var redis       = redisClient(6379, 'localhost');
    var config      = require('./config/database'); // get db config file
    var User        = require('./app/models/user'); // get the mongoose model
    var Products    = require('./app/models/products'); //get the mongoose model
    var Makeissue   = require('./app/models/makeissue'); //get the mongoose model
    var port        = process.env.PORT || 8080;
    var jwt         = require('jwt-simple');
    var access      = require('./config/database.js'); 
    MongoClient.connect(mongoUrl, function(err, db) {
        if (err) throw 'Error connecting to database - ' + err;
            // get our request parameters
            app.use(bodyParser.urlencoded({ extended: false }));
            app.use(bodyParser.json());

            // log to console
            app.use(morgan('dev'));

            // Use the passport package in our application
            app.use(passport.initialize());

            // demo Route (GET http://localhost:8080)
            app.get('/', function(req, res) {
                  res.send('The API is at http://localhost:' + port + '/api');
            });

            // connect to database
            mongoose.connect(config.database);

            // pass passport for configuration
            require('./config/passport')(passport);

            // bundle our routes
            var apiRoutes = express.Router();


            // create a new user account (POST http://localhost:8080/api/signup)
            apiRoutes.post('/signup', function(req, res) {
              if (!req.body.name || !req.body.password || !req.body.email) {
                res.json({success: false, msg: 'Please pass name and password and email.'});
              } else {
                var newUser = new User({
                  name: req.body.name,
                  password: req.body.password,
                  email: req.body.email
                });
                // save the user
                newUser.save(function(err) {
                  if (err) {
                    return res.json({success: false, msg: 'Username already exists.'});
                  }
                  res.json({success: true, msg: 'Successful created new user.'});
                });
              }
            });

            // route to authenticate a user (POST http://localhost:8080/api/authenticate)
            apiRoutes.post('/authenticate', function(req, res) {
              User.findOne({
                name: req.body.name
              }, function(err, user) {
                if (err) throw err;

                if (!user) {
                  res.send({success: false, msg: 'Authentication failed. User not found.'});
                } else {
                  // check if password matches
                  user.comparePassword(req.body.password, function (err, isMatch) {
                    if (isMatch && !err) {
                      // if user is found and password is right create a token
                      var token = jwt.encode(user, config.secret);
                      // return the information including token as JSON
                      res.json({success: true, token: 'JWT ' + token});
                    } else {
                      res.send({success: false, msg: 'Authentication failed. Wrong password.'});
                    }
                  });
                }
              });
            });

            apiRoutes.post('/book', function (req, res) {
                    if (!req.body.title || !req.body.author) res.status(400).send("Please send a title and an author for the book");
                    else if (!req.body.text) res.status(400).send("Please send some text for the book");
                    else {
                        access.saveBook(db, req.body.title, req.body.author, req.body.text, function (err) {
                            if (err) res.status(500).send("Server error");
                            else res.status(201).send("Saved");
                        });
                    }
                });

             apiRoutes.get('/book/:title', function (req, res) {
                    if (!req.param('title')) res.status(400).send("Please send a proper title");
                    else {
                        access.findBookByTitle(db, req.param('title'), function (book) {
                            if (!req.body.text) res.status(500).send("Server error");
                            else res.status(200).send(book);
                        });
                    }
                });



            apiRoutes.get('/productinfo' , function(req, res, next) {
                Products.find( function (err, result) {
                if (err) return console.error(err);
                  res.json(result);
              });
            });

             apiRoutes.get('/resources/productinfo/:name' , function(req, res) {
                if (!req.param('name')) res.status(400).send("Please send a proper name");
                else{
                  access.findProductsByName(Products, req.param('name'), function(Products) {
                      if (!products) res.status(500).send("server error");
                        });
                    }
                 });

            // create a new Product (POST http://localhost:8080/api/productsignup)
            apiRoutes.post('/resources/productsignup', function(req, res) {
              if (!req.body.name || !req.body.serialnumber) {
                res.json({success: false, msg: 'Please pass name and serial number.'});
                } else {
                var newProducts = new Products({
                  name: req.body.name,
                  serialnumber: req.body.serialnumber     
                });
                // save the Product
                newProducts.save(function(err) {
                  if (err) {
                    return res.json({success: false, msg: 'Product already exists.'});
                  }
                  res.json({success: true, msg: 'Successful created new Product.'});
                });
              }
            });

            apiRoutes.post('/resources/createpost', function(req, res) {
              if (!req.body.issue) {
                res.json({success: false, msg: 'Please pass a issue.'});
                } else {
                var newMakeissue = new Makeissue({
                  issue: req.body.issue    
                });
                // save the Product
                newMakeissue.save(function(err) {
                  if (err) {
                    return res.json({success: false, msg: 'Post already exists.'});
                  }
                  res.json({success: true, msg: 'Successful created new post.'});
                });
              }
            });







            // route to a restricted info (GET http://localhost:8080/api/memberinfo)
            apiRoutes.get('/memberinfo', passport.authenticate('jwt', { session: false}), function(req, res) {
              var token = getToken(req.headers);
              if (token) {
                var decoded = jwt.decode(token, config.secret);
                User.findOne({
                  name: decoded.name
                }, function(err, user) {
                    if (err) throw err;

                    if (!user) {
                      return res.status(403).send({success: false, msg: 'Authentication failed. User not found.'});
                    } else {
                      res.json({success: true, msg: 'Welcome in the member area ' + user.name + '!'});
                    }
                });
              } else {
                return res.status(403).send({success: false, msg: 'No token provided.'});
              }
            });

            getToken = function (headers) {
              if (headers && headers.authorization) {
                var parted = headers.authorization.split(' ');
                if (parted.length === 2) {
                  return parted[1];
                } else {
                  return null;
                }
              } else {
                return null;
              }
            };


            // connect the api routes under /api/*
            app.use('/api', apiRoutes);
            module.exports = apiRoutes;




            app.listen(8080, function() {
                console.log('listening on port 8080');
            });
    });

and the database.js

module.exports = {
  'secret': 'di.ionio.gr',
  'database': 'mongodb://localhost/firstapp'
};

module.exports.saveBook = function (db, title, author, text, callback) {
    db.collection['text'].save({
        title: title,
        author: author,
        text: text
    }, callback);
};

module.exports.findBookByTitle = function (db, title, callback) {
    db.collection['text'].findOne({
        title: title
    }, function (err, doc) {
        if (err || !doc) callback(null);
        else callback(doc.text);
    });
};

module.exports.findProductsByName = function (db, name, callback) {
    db.collection['products'].findOne({
        name: name
    }, function (err, doc) {
        if (err || !doc) callback(null);
        else callback(doc.products);
    });
};

and the package.json

{
  "name": "firstapp",
  "main": "server.js",
  "dependencies": {
    "bcrypt": "^0.8.5",
    "body-parser": "~1.9.2",
    "express": "~4.9.8",
    "jwt-simple": "^0.3.1",
    "mongoose": "~4.2.4",
    "mongodb" : "~1.2.5",
    "morgan": "~1.5.0",
    "passport": "^0.3.0",
    "passport-jwt": "^1.2.1",
    "redis": "~0.10.1"
  }
}   
3
  • Add new error log, pls Commented Jan 16, 2016 at 14:31
  • i updated my answer Commented Jan 16, 2016 at 14:56
  • Coding a server in nodejs is an ugly task Commented Dec 8, 2017 at 23:29

4 Answers 4

2

incorect syntax, you must read property of db.collection, but you call that. Example:

db.collection['products']!!!


db.collection['text'].save({
        title: title,
        author: author,
        text: text
    }, callback);
};

module.exports.findBookByTitle = function (db, title, callback) {
    db.collection['text'].findOne({
        title: title
    }, function (err, doc) {
        if (err || !doc) callback(null);
        else callback(doc.text);
    });
};

module.exports.findProductsByName = function (db, name, callback) {
    db.collection['products'].findOne({

For example

var object = { 'some_value': 'value', 'some_methid': function(){ return 'method result'} }

You can read and set property 'some_value', for example:

object['some_value'] // return 'value'
object.some_value // return 'value'

// STEP 2

Ok, in your methods of database.js you pass db variable, but this is not of db instance, it is mongoose model, and you must write like this:

module.exports.findBookByTitle = function (model, title, callback) {
    model.findOne({
        title: title
    }, function (err, doc) {
        if (err || !doc) callback(null);
        else callback(doc.text);
    });
};

module.exports.findProductsByName = function (model, name, callback) {
    model.findOne({
        name: name
    }, function (err, doc) {
        if (err || !doc) callback(null);
        else callback(doc.products);
    });
};
Sign up to request clarification or add additional context in comments.

5 Comments

so i add db.collection['products'] in the line?
You must replate db.collection('products') to db.collection['products'] or db.collection.products. When you use db.collection('products') you call collection but collection is not a function!
write to question, we cant try resolve that together
ok! i'll post it to question but the result is : TypeError: Cannot read property &#39;findOne&#39; of undefined BTW ty for your help
Will be better if you update your question-post with full error
1

You can only declare module.exports once in a file, so you should change:

In your database.js file:

module.exports.saveBook 

to

exports.saveBook 

and so on

Take a look at this: https://www.sitepoint.com/understanding-module-exports-exports-node-js/

Comments

0

in package.json folder find mongodb inside dependencies and update with these value:

"mongodb": "^2.2.33",

Then Run

npm install

again. That will solve your probem.

Comments

0

Make sure to add following to the scripts sectionin your package.json file

  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js",
    "dev": "nodemon server.js",
    "debugger": "DEBUG=*:* npm run dev"
  },

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.