NodeJS with express, can't load model - node.js

I'm using NodeJS with express, consign, body-parser, etc.
I'm trying to load a module in a var, so i can use their functions, but i'm getting a:
TypeError: Cannot read property 'listar' of undefined
at app.get (/home/sartori/Documentos/Projetos/react-system/api/controllers/autores.js:6:11)
at Layer.handle [as handle_request] (/home/sartori/Documentos/Projetos/react-system/api/node_modules/express/lib/router/layer.js:95:5)
at next (/home/sartori/Documentos/Projetos/react-system/api/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/sartori/Documentos/Projetos/react-system/api/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/home/sartori/Documentos/Projetos/react-system/api/node_modules/express/lib/router/layer.js:95:5)
at /home/sartori/Documentos/Projetos/react-system/api/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/home/sartori/Documentos/Projetos/react-system/api/node_modules/express/lib/router/index.js:335:12)
at next (/home/sartori/Documentos/Projetos/react-system/api/node_modules/express/lib/router/index.js:275:10)
at /home/sartori/Documentos/Projetos/react-system/api/node_modules/express-validator/lib/express_validator.js:250:5
at Layer.handle [as handle_request] (/home/sartori/Documentos/Projetos/react-system/api/node_modules/express/lib/router/layer.js:95:5)
Here's my controller:
module.exports = app => {
app.get('/api/autores', (req,res) => {
let connection = app.connection.connectionFactory();
let autores = app.models.AutoresDao(connection);
autores.listar((error,result) => {
if(error) {
console.log('Erro ao listar os autores: ' + error);
res.status(500).send(error);
} else {
res.json(result);
}
});
});
}
Here's the AutoresDao:
function AutoresDao(connection) {
this._connection = connection;
}
AutoresDao.prototype.listar = callback => this._connection.query('SELECT * FROM autores', callback);
module.exports = function() {
return AutoresDao;
}
The problem is: Cannot read property 'listar' of undefined.
Apparently the problem is loading the AutoresDao file.
I'm 100% sure of files path, AutoresDao is inside models folder, already loaded on consign. The same for the controller, connection, express config etc.
Any idea of what i'm doing wrong?

You need to be using the 'new' keyword if you are going to format your object constructor function in that manner. You will have to reformat your AutoresDao function to explicitly return an object, or use the 'new' keyword when you assign it to autores in the controller.
Please checkout this article for an explanation of the different instantiation patterns.
https://medium.com/dailyjs/instantiation-patterns-in-javascript-8fdcf69e8f9b
Hope that helps! Cheers.

Related

Unable to grab data from MongoDB to use on Express

I'm currently trying to grab data from MongoDB via Mongoose, and show it with Express. However, this is the following error I'm getting:
TypeError: /home/node/CSci-Project/views/account.ejs:31
29| <% if (req.user.twitter.token) { %>
30| <p>
>> 31| <strong>id</strong>: <%= user.twitter.id %><br>
32| <strong>token</strong>: <%= user.twitter.token %><br>
33| <strong>display name</strong>: <%= profile.twitter.displayName %><br>
34| <strong>username</strong>: <%= profile.twitter.username %><br>
Cannot read property 'twitter' of undefined
at eval (/home/node/CSci-Project/views/account.ejs:13:31)
at account (/home/node/CSci-Project/node_modules/ejs/lib/ejs.js:691:17)
at tryHandleCache (/home/node/CSci-Project/node_modules/ejs/lib/ejs.js:272:36)
at View.exports.renderFile [as engine] (/home/node/CSci-Project/node_modules/ejs/lib/ejs.js:489:10)
at View.render (/home/node/CSci-Project/node_modules/express/lib/view.js:135:8)
at tryRender (/home/node/CSci-Project/node_modules/express/lib/application.js:640:10)
at Function.render (/home/node/CSci-Project/node_modules/express/lib/application.js:592:3)
at ServerResponse.render (/home/node/CSci-Project/node_modules/express/lib/response.js:1012:7)
at /home/node/CSci-Project/app/routes.js:67:13
at Layer.handle [as handle_request] (/home/node/CSci-Project/node_modules/express/lib/router/layer.js:95:5)
at next (/home/node/CSci-Project/node_modules/express/lib/router/route.js:137:13)
at isLoggedIn (/home/node/CSci-Project/app/routes.js:105:16)
at Layer.handle [as handle_request] (/home/node/CSci-Project/node_modules/express/lib/router/layer.js:95:5)
at next (/home/node/CSci-Project/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/node/CSci-Project/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/home/node/CSci-Project/node_modules/express/lib/router/layer.js:95:5)
I thought I had passed it through with callback and with findOne being asynchronous, so I'm not sure where to go from here. Here are the relevant files:
views/account.ejs (the page I'm trying to view)
app/routes.js
app/models/user.js
app/models/profile.js
Sorry if I've made any simple mistakes in here - I'm new to Node and I've come over from C#, so I'm still in the process of learning the differences. Also worth noting that data is definitely on MongoDB and it all exists.
Well, I managed to figure it out, after countless attempts. My mistake was that I thought by putting var userInfo = UserModel.findOne it would just simply print itself out as userInfo.id, userInfo.token, etc, but no. I actually meant to use the output that's inside of UserModel.findOne.
app/routes.js
module.exports = function (app, passport) {
app.get('/account', isLoggedIn, function (req, res) {
var UserModel = require('./models/user.js');
var ProfileModel = require('./models/profile.js');
UserModel.findOne({
'twitter.id': req.user.twitter.id
}, function (err, userInfo) {
if (err) {
return res.redirect('/');
} else {
ProfileModel.findOne({
'twitter.id': req.user.twitter.id
}, function (err, profileInfo) {
if (err) {
return res.redirect('/');
} else {
res.render('account.ejs', {
req: req,
user: userInfo,
profile: profileInfo
});
}
});
}
});
});
};

EJS: ReferenceError: bot is not defined

I want to make a bot dashboard in Discord.js and EJS.
I have an error.
>> 1| <%- include('blocks/header', {bot, user, path})%>
bot is not defined
at eval (/app/dashboard/index.ejs:10:43)
at index (/rbd/pnpm-volume/694e46f9-27bb-4ad9-87e8-c675e51f8f94/node_modules/.registry.npmjs.org/ejs/2.7.4/node_modules/ejs/lib/ejs.js:682:17)
at tryHandleCache (/rbd/pnpm-volume/694e46f9-27bb-4ad9-87e8-c675e51f8f94/node_modules/.registry.npmjs.org/ejs/2.7.4/node_modules/ejs/lib/ejs.js:254:36)
at View.exports.renderFile [as engine] (/rbd/pnpm-volume/694e46f9-27bb-4ad9-87e8-c675e51f8f94/node_modules/.registry.npmjs.org/ejs/2.7.4/node_modules/ejs/lib/ejs.js:485:10)
at View.render (/rbd/pnpm-volume/694e46f9-27bb-4ad9-87e8-c675e51f8f94/node_modules/.registry.npmjs.org/express/4.17.1/node_modules/express/lib/view.js:135:8)
at tryRender (/rbd/pnpm-volume/694e46f9-27bb-4ad9-87e8-c675e51f8f94/node_modules/.registry.npmjs.org/express/4.17.1/node_modules/express/lib/application.js:640:10)
at Function.render (/rbd/pnpm-volume/694e46f9-27bb-4ad9-87e8-c675e51f8f94/node_modules/.registry.npmjs.org/express/4.17.1/node_modules/express/lib/application.js:592:3)
at ServerResponse.render (/rbd/pnpm-volume/694e46f9-27bb-4ad9-87e8-c675e51f8f94/node_modules/.registry.npmjs.org/express/4.17.1/node_modules/express/lib/response.js:1012:7)
at app.get (/app/util/dashboard.js:45:7)
at Layer.handle [as handle_request] (/rbd/pnpm-volume/694e46f9-27bb-4ad9-87e8-c675e51f8f94/node_modules/.registry.npmjs.org/express/4.17.1/node_modules/express/lib/router/layer.js:95:5)
But I have it defined.
const renderTemplate = (res, req, template, data = {}) => {
const baseData = {
bot: client,
path: req.path,
user: req.isAuthenticated() ? req.user : null
};
res.render(templateDir + path.sep + template, {baseData, data});
};
I have a include tag in my index.ejs file.
<%- include('blocks/header', {bot, user, path})%>
For any help, thank you!
The way around this would be to render it differently;
const renderTemplate = (res, req, template, data = {}) => {
res.render(templateDir + path.sep + template), {
bot: client,
path: req.path,
user: req.isAuthenticated() ? req.user : null
data: data
})
};

Nodejs middleware .pre shows not a function

var categoryList = new Referral({categoryList : category});
categoryList.pre('save', function (next) {
Referral.find({categoryList : category}, function (err, docs) {
if (!docs.length){
next();
}else{
console.log('Data exists: ', category);
next(new Error("Data exists!"));
}
})
})
Referral is my variable assigned to my schema.
categoryList is the object
This gives an error
TypeError: categoryList.pre is not a function at
D:\Aventyn\ClipCare_v2\app\api.js:112:18 at Layer.handle [as
handle_request]
(D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\layer.js:95:5)
at next
(D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\route.js:131:13)
at Route.dispatch
(D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request]
(D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\layer.js:95:5)
at
D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:277:22
at Function.process_params
(D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:330:12)
at next
(D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:271:10)
at Function.handle
(D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:176:3)
at router
(D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:46:12)
at Layer.handle [as handle_request]
(D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\layer.js:95:5)
at trim_prefix
(D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:312:13)
at
D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:280:7
at Function.process_params
(D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:330:12)
at next
(D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:271:10)
at
D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:618:15
Try changing:
categoryList.pre('save', function (next) {
// ...
})
to:
categoryList.schema.pre('save', function (next) {
// ...
})
The .pre() is a method of the Mongoose schema, not a model.
Middleware (like pre hooks) are part of a schema. It looks like you're trying to use it on a single document, which is not how it works.
Instead, use it on the schema that you used to create the Referral model:
ReferralSchema.pre('save', ...);
This does mean that the pre hook will be applied to all documents of that schema.

writing in mongodb fails / node.js

I use node.js to communicate with the mongodb-server. The send of the variables and the export of the function are working. The writing in the DB isnt and I can't find the error. It seems to be a problem with the insert, but i cant find it.....
mongo.js
exports.InsertDocument = function InsertDocument(tblname, OutUser, OutEmail, OutDate) {
console.log("function InsertDocument called");
console.log(tblname + OutUser + OutEmail + OutDate);
var document = {tablename:tblname, out_user:OutUser, out_email:OutEmail, out_date:OutDate };
db.collection('movements').insert(document, function(err, results) {
if (err) throw err;
console.log("data saved");
db.close();
});
}
index.js
/* POST home page. */
router.post('/create_movement', function(req, res) {
var tblname = req.body.tablename,
OutUser = req.body.out_user,
OutEmail = req.body.out_email,
OutDate = req.body.out_date;
mongo.InsertDocument(tblname, OutUser, OutEmail, OutDate);
res.send("succesfull");
});
node.js console
Example app listening at http://:::3005
Connection established to mongodb://localhost:27017/straff
function InsertDocument called
test234
POST /create_movement 500 317.042 ms - 954
out of rest client
<!DOCTYPE html><html><head><title></title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>db is not defined</h1><h2></h2><pre>ReferenceError: db is not defined
at Object.InsertDocument (D:\test1\mongo.js:26:2)
at D:\test1\routes\index.js:17:9
at Layer.handle [as handle_request] (D:\test1\node_modules\express\lib\router\layer.js:82:5)
at next (D:\test1\node_modules\express\lib\router\route.js:110:13)
at Route.dispatch (D:\test1\node_modules\express\lib\router\route.js:91:3)
at Layer.handle [as handle_request] (D:\test1\node_modules\express\lib\router\layer.js:82:5)
at D:\test1\node_modules\express\lib\router\index.js:267:22
at Function.proto.process_params (D:\test1\node_modules\express\lib\router\index.js:321:12)
at next (D:\test1\node_modules\express\lib\router\index.js:261:10)
at Function.proto.handle (D:\test1\node_modules\express\lib\router\index.js:166:3)</pre></body></html>
The error tells you everything:
ReferenceError: db is not defined
at Object.InsertDocument (D:\test1\mongo.js:26:2)
You have to connect to your database, and add all the details into a variable called db.
Using Mongojs would be like:
var mongojs = require('mongojs');
var db = mongojs(connectionString, [collections]);
You'll have to check the docs for the driver your using.

Cannot read property 'prototype' of undefined

I'm starting with Parse and Node.js. I'm trying to retrieve data from Parse db and I don't manage to.
var Parse = require('parse').Parse;
Parse.initialize("*************", "*****************");
module.exports = {
index: function(req, res, next){
var query = new Parse.Query(Parse.Event);
query.find({
success: function(results) {
console.log(results);
},
error: function(error) {
console.log(error.message);
}
});
}
}
And I got this error :
TypeError: Cannot read property 'prototype' of undefined
at Object.Parse.Query (/Users/tchiss_a/test/webapp/node_modules/parse/build/parse-latest.js:7771:33)
at module.exports.index (/Users/tchiss_a/test/webapp/api/Events.js:7:20)
at Layer.handle [as handle_request] (/Users/tchiss_a/test/webapp/node_modules/express/lib/router/layer.js:82:5)
at next (/Users/tchiss_a/test/webapp/node_modules/express/lib/router/route.js:100:13)
at Route.dispatch (/Users/tchiss_a/test/webapp/node_modules/express/lib/router/route.js:81:3)
at Layer.handle [as handle_request] (/Users/tchiss_a/test/webapp/node_modules/express/lib/router/layer.js:82:5)
at /Users/tchiss_a/test/webapp/node_modules/express/lib/router/index.js:235:24
at Function.proto.process_params (/Users/tchiss_a/test/webapp/node_modules/express/lib/router/index.js:313:12)
at /Users/tchiss_a/test/webapp/node_modules/express/lib/router/index.js:229:12
at Function.match_layer (/Users/tchiss_a/test/webapp/node_modules/express/lib/router/index.js:296:3)
Can someone help me please ?
There is a fix listed in the comments, but the actual problem here is that you're treating a user-defined class "Event" like a Parse class.
change
var query = new Parse.Query(Parse.Event);
to
var query = new Parse.Query("Event");

Resources