Cannot read property 'prototype' of undefined - node.js

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");

Related

"message": "Cannot read properties of undefined (reading 'split')",

"message": "Cannot read properties of undefined (reading 'split')",
+ "stack": "TypeError: Cannot read properties of undefined (reading 'split')
+ at /Users/dhruv/code/c0485f/src/api/posts.js:66:31
+ at Layer.handle [as handle_request] (/Users/dhruv/code/c0485f/node_modules/express/lib/router/layer.js:95:5)
+ at next (/Users/dhruv/code/c0485f/node_modules/express/lib/router/route.js:144:13)
+ at Route.dispatch (/Users/dhruv/code/c0485f/node_modules/express/lib/router/route.js:114:3)
+ at Layer.handle [as handle_request] (/Users/dhruv/code/c0485f/node_modules/express/lib/router/layer.js:95:5)
+ at /Users/dhruv/code/c0485f/node_modules/express/lib/router/index.js:284:15
+ at Function.process_params (/Users/dhruv/code/c0485f/node_modules/express/lib/router/index.js:346:12)
+ at next (/Users/dhruv/code/c0485f/node_modules/express/lib/router/index.js:280:10)
+ at Function.handle (/Users/dhruv/code/c0485f/node_modules/express/lib/router/index.js:175:3)
+ at router (/Users/dhruv/code/c0485f/node_modules/express/lib/router/index.js:47:12)",
I am getting this error from the code attached below and while calling this API there is data in body "authorIds"
router.get('/', async (req, res, next) => {
try {
const { authorIds, sortBy = 'id', direction = 'asc' } = req.body;
//if access token is not verified then this statemnt will throw an error.
jwt.verify(req.headers['x-access-token'], process.env.SESSION_SECRET);
//finding all posts which all are associated with authorIds got from request.
const posts = await Post.findAll({
order: [[sortBy, direction]],
include: [
{
model: UserPost,
required: true,
attributes: [],
where: {
userId: authorIds.split(","),
},
},
],
});
//console.log(posts);
res.json({ posts });
} catch (error) {
if (error.name === 'JsonWebTokenError') {
return res.status(401).json({ error: error.message });
}
next(error);
}
});
make sure you are sending the authorIds in request body and its value is valid and make sure you use express.json() middleware in your express app at the start so it can parse the body.
app.use(express.json());
and one more thing
you are trying to read request body from a get request!
get request cant carry a body, only query param and path param and headers are allowed.
turn it to a post request or send params in query or path.

Keystone Tutorial: cannot read property 'id' of undefined

I was following the tutorial on starting KeystoneJS from scratch. But when I got to the second part of the tutorial, creating data models, I got this error:
Error thrown for request: /keystone/
TypeError: Cannot read property 'id' of undefined
at IndexRoute (/root/websie/node_modules/keystone/admin/server/routes/index.js:39:16)
at Layer.handle [as handle_request] (/root/websie/node_modules/express/lib/router/layer.js:95:5)
at next (/root/websie/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/root/websie/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/root/websie/node_modules/express/lib/router/layer.js:95:5)
at /root/websie/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/root/websie/node_modules/express/lib/router/index.js:335:12)
at next (/root/websie/node_modules/express/lib/router/index.js:275:10)
at /root/websie/node_modules/keystone/admin/server/app/createDynamicRouter.js:26:3
at Layer.handle [as handle_request] (/root/websie/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/root/websie/node_modules/express/lib/router/index.js:317:13)
at /root/websie/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/root/websie/node_modules/express/lib/router/index.js:335:12)
at next (/root/websie/node_modules/express/lib/router/index.js:275:10)
at handleUploadedFiles (/root/websie/node_modules/keystone/lib/uploads.js:6:54)
at Layer.handle [as handle_request] (/root/websie/node_modules/express/lib/router/layer.js:95:5)
GET /keystone/ 500 8.835 ms
Since I'm new to Keystone JS, I don't quite know if this problem is with the code itself or the database.
Things to consider:
This is run on a linux environment
MongoDB is freshly installed
These are all the files so far:
keystone.js
const keystone = require('keystone')
keystone.init({
'cookie secret': 'SECRET KEY',
'name' : 'theproject',
'user model' : 'User',
'auth' : 'true',
'auto update' : 'true',
});
keystone.import('models');
keystone.start();
User.js:
const keystone = require('keystone');
var User = new keystone.List('User');
User.add({
displayName: { type: String },
password: { type: keystone.Field.Types.Password },
email: { type: keystone.Field.Types.Email, unique: true },
})
User.schema.virtual('canAccessKeystone').get(function () {
return true;
});
User.defaultColumns = 'id, displayName, email';
User.register();
Your User model doesn't have an "id" attribute. So when you set your User.defaultColumns to "id" it doesn't find anything.
All models do however have an "_id" attribute.
I would just remove "id" from your default columns and move forward.
User.defaultColumns = 'displayName, email';
If that doesn't fix it you might be requesting the id elsewhere.

NodeJS with express, can't load model

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.

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.

Resources