node.js - TypeError: db.collection is not a function, CANNOT GET -
i'm trying data apiroutes.get('/resources/productinfo/:name')
, have error, dont know whats going wrong... apiroutes.get('/book/:title')
doesnt seems work! dont know doing wrong
updated:
> typeerror: cannot read property 'findone' of undefined <br> at object.module.exports.findbookbytitle > (/home/themis/firstapp/api/config/database.js:22:26) <br> > at /home/themis/firstapp/api/server.js:109:22 <br> > at layer.handle [as handle_request] > (/home/themis/firstapp/api/node_modules/express/lib/router/layer.js:82:5) > <br> at next > (/home/themis/firstapp/api/node_modules/express/lib/router/route.js:100:13) > <br> at route.dispatch > (/home/themis/firstapp/api/node_modules/express/lib/router/route.js:81:3) > <br> at layer.handle [as handle_request] > (/home/themis/firstapp/api/node_modules/express/lib/router/layer.js:82:5) > <br> at > /home/themis/firstapp/api/node_modules/express/lib/router/index.js:234:24 > <br> at param > (/home/themis/firstapp/api/node_modules/express/lib/router/index.js:331:14) > <br> at param > (/home/themis/firstapp/api/node_modules/express/lib/router/index.js:347:14) > <br> at function.proto.process_params > (/home/themis/firstapp/api/node_modules/express/lib/router/index.js:391:3) > <br> at > /home/themis/firstapp/api/node_modules/express/lib/router/index.js:228:12 > <br> at function.match_layer > (/home/themis/firstapp/api/node_modules/express/lib/router/index.js:295:3) > <br> at next > (/home/themis/firstapp/api/node_modules/express/lib/router/index.js:189:10) > <br> at > /home/themis/firstapp/api/node_modules/express/lib/router/index.js:191:16 > <br> at function.match_layer > (/home/themis/firstapp/api/node_modules/express/lib/router/index.js:295:3) > <br> at next > (/home/themis/firstapp/api/node_modules/express/lib/router/index.js:189:10)
here 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'); // db config file var user = require('./app/models/user'); // mongoose model var products = require('./app/models/products'); //get mongoose model var makeissue = require('./app/models/makeissue'); //get 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 database - ' + err; // our request parameters app.use(bodyparser.urlencoded({ extended: false })); app.use(bodyparser.json()); // log console app.use(morgan('dev')); // use passport package in our application app.use(passport.initialize()); // demo route (get http://localhost:8080) app.get('/', function(req, res) { res.send('the api @ http://localhost:' + port + '/api'); }); // connect database mongoose.connect(config.database); // pass passport configuration require('./config/passport')(passport); // bundle our routes var apiroutes = express.router(); // create 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 , password , email.'}); } else { var newuser = new user({ name: req.body.name, password: req.body.password, email: req.body.email }); // save user newuser.save(function(err) { if (err) { return res.json({success: false, msg: 'username exists.'}); } res.json({success: true, msg: 'successful created new user.'}); }); } }); // route authenticate 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 found , password right create token var token = jwt.encode(user, config.secret); // return information including token 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 title , author book"); else if (!req.body.text) res.status(400).send("please send text 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 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 proper name"); else{ access.findproductsbyname(products, req.param('name'), function(products) { if (!products) res.status(500).send("server error"); }); } }); // create 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 , serial number.'}); } else { var newproducts = new products({ name: req.body.name, serialnumber: req.body.serialnumber }); // save product newproducts.save(function(err) { if (err) { return res.json({success: false, msg: 'product 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 issue.'}); } else { var newmakeissue = new makeissue({ issue: req.body.issue }); // save product newmakeissue.save(function(err) { if (err) { return res.json({success: false, msg: 'post exists.'}); } res.json({success: true, msg: 'successful created new post.'}); }); } }); // route 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 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 api routes under /api/* app.use('/api', apiroutes); module.exports = apiroutes; app.listen(8080, function() { console.log('listening on port 8080'); }); });
and 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 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" } }
incorect syntax, must read property of db.collection, 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 , set property 'some_value', example:
object['some_value'] // return 'value' object.some_value // return 'value'
// step 2
ok, in methods of database.js pass db variable, not of db instance, mongoose model, , must write 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); }); };
Comments
Post a Comment