EJS: ReferenceError: bot is not defined - node.js

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

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.

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

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 - Supertest throw Error: Can't set headers after they are sent when I use app to test, such as supertest.agent(express())

I use supertest to test my RESTful API which develop by express, but I encountered a problem. The following the debug message.
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11)
at ServerResponse.header \nodejs-framework\node_modules\express\lib\response.js:719:10)
at ServerResponse.send \nodejs-framework\node_modules\express\lib\response.js:164:12)
at done \nodejs-framework\node_modules\express\lib\response.js:956:10)
at View.exports.renderFile [as engine] \nodejs-framework\node_modules\ejs\lib\ejs.js:355:10)
at View.render \nodejs-framework\node_modules\express\lib\view.js:126:8)
at tryRender \nodejs-framework\node_modules\express\lib\application.js:639:10)
at EventEmitter.render \nodejs-framework\node_modules\express\lib\application.js:591:3)
at ServerResponse.render \nodejs-framework\node_modules\express\lib\response.js:960:7)
at D:\H60\H60_New\nodejs-framework\app.js:216:13
at Layer.handle_error \nodejs-framework\node_modules\express\lib\router\layer.js:71:5)
at trim_prefix \nodejs-framework\node_modules\express\lib\router\index.js:310:13)
at D:\H60\H60_New\nodejs-framework\node_modules\express\lib\router\index.js:280:7
at Function.process_params \nodejs-framework\node_modules\express\lib\router\index.js:330:12)
at next \nodejs-framework\node_modules\express\lib\router\index.js:271:10)
at D:\H60\H60_New\nodejs-framework\node_modules\express\lib\router\index.js:618:15
at IncomingMessage.next \nodejs-framework\node_modules\express\lib\router\index.js:256:14)
at done \nodejs-framework\node_modules\express\lib\response.js:955:25)
at tryRender \nodejs-framework\node_modules\express\lib\application.js:641:5)
at EventEmitter.render \nodejs-framework\node_modules\express\lib\application.js:591:3)
When I use supertest.agent(envFile.API_SERVER.url) as test target, it will pass forever,
but while I use supertest.agent(envFile.API_SERVER.app) which is a enter point in my project, it will be failed when I need to respond in middleware.
The following, is my code in my middleware.
let paramObj = {
account: -1,
pw: -2,
email: -3,
},
paramObjKey = Object.keys(paramObj);
for ( let param of paramObjKey ) {
if ( typeof req.body[param] === "undefined" ) {
res.json(paramObj[param]);
return;
}
}
next();
I have another middleware which will handle exceptions, and it is the root cause in this problem. It will respond again after the previous middleware has responded.
app.use(function(err, req, res, next) {
if ( !typeService.isNull(err) ) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
}
});
You can't send responses multiple times.
Having res.json(paramObj[param]); inside a for loop sends a response each iteration.
You need to send the response only once.
I agree w/ #Swaraj.
Change the return in your for loop to break instead.
let paramObj = {
account: -1,
pw: -2,
email: -3,
},
paramObjKey = Object.keys(paramObj);
for ( let param of paramObjKey ) {
if ( typeof req.body[param] === "undefined" ) {
res.json(paramObj[param]);
break;
}
}
next();
This will break out of the for loop and execute the next link in the middleware chain.

Error return value, Nodejs, JWT

function isTokened(data) {
var token = data;
if(token != null || token != undefined){
jwt.verify(token, app.get('userToken'), function(err, decoded) {
return {
"user": decoded._doc.name,
"href": "/salir",
"text": "Salir"
};
});
}else{
return {
href: "/entrar",
text: "Entrar"
};
}
}
TypeError: c:\Users\Hector\Desktop\Proyecto\views\index.jade:81
79| li 80|
a.text(href='/acerca') Acerca
81| if au.user 82| li 83| a.text(href="/area") #{au.user} 84|
li
Cannot read property 'user' of undefined at eval (eval at
(c:\Users\Hector\Desktop\Proyecto\node_modules\jade\lib\index.js:218:8),
:354:8) at eval (eval at
(c:\Users\Hector\Desktop\Proyecto\node_modules\jade\lib\index.js:218:8),
:453:22) at exports.compile.res
(c:\Users\Hector\Desktop\Proyecto\node_modules\jade\lib\index.js:219:38)
at Object.exports.renderFile
(c:\Users\Hector\Desktop\Proyecto\node_modules\jade\lib\index.js:380:38)
at Object.exports.renderFile
(c:\Users\Hector\Desktop\Proyecto\node_modules\jade\lib\index.js:370:21)
at View.exports.__express [as engine]
(c:\Users\Hector\Desktop\Proyecto\node_modules\jade\lib\index.js:417:11)
at View.render
(c:\Users\Hector\Desktop\Proyecto\node_modules\express\lib\view.js:126:8)
at tryRender
(c:\Users\Hector\Desktop\Proyecto\node_modules\express\lib\application.js:639:10)
at EventEmitter.render
(c:\Users\Hector\Desktop\Proyecto\node_modules\express\lib\application.js:591:3)
at ServerResponse.render
(c:\Users\Hector\Desktop\Proyecto\node_modules\express\lib\response.js:961:7)
at c:\Users\Hector\Desktop\Proyecto\app.js:167:6 at Layer.handle
[as handle_request]
(c:\Users\Hector\Desktop\Proyecto\node_modules\express\lib\router\layer.js:95:5)
at next
(c:\Users\Hector\Desktop\Proyecto\node_modules\express\lib\router\route.js:131:13)
at Route.dispatch
(c:\Users\Hector\Desktop\Proyecto\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request]
(c:\Users\Hector\Desktop\Proyecto\node_modules\express\lib\router\layer.js:95:5)
at
c:\Users\Hector\Desktop\Proyecto\node_modules\express\lib\router\index.js:277:22
jwt.verify is not a sync function so your function ends up exiting without returning anything. You need to use callback approach to get verify result. You want something like this:
function isTokened(data, callback) {
if(data){
jwt.verify(data, app.get('userToken'), function(err, decoded) {
callback && callback({
"user": decoded._doc.name,
"href": "/salir",
"text": "Salir"
});
});
}else{
callback && callback({
href: "/entrar",
text: "Entrar"
});
}
}
You will probably want to do some error handling in case jwt.verify returns an error or decoded does not contain required fields.

Resources