ERROR: Cannot read property 'name' of undefined when I use ajaxify.go on /categories
-
The problem is that when I write the path " /categories" ,a function "ajaxify.go = function (url, callback, quiet)" is called and I obtain the error. My purpose is overwrite the path" /categories" with my code:
This is my code:
{ "hook": "static:app.preload", "method": "preload" },
This is my library.js:
converter.preload = function(params, callback) { var app = params.app, hostMiddleware = params.middleware; helpers.setupPageRoute(app,'/categories', hostMiddleware,[], controllers.renderCategories); helpers.setupPageRoute(app,'/api/categories', hostMiddleware,[], controllers.renderCategories); callback(); };
This is my controllers.js:
Controllers.renderCategories1 = function(req, res, callback) { res.locals.metaTags = [{ name: "title", content: validator.escape(String(meta.config.title || 'NodeBB')) }, { name: "description", content: validator.escape(String(meta.config.description || '')) }, { property: 'og:title', content: '[[pages:categories]]' }, { property: 'og:type', content: 'website' }]; var ogImage = meta.config['og:image'] || meta.config['brand:logo'] || ''; if (ogImage) { if (!ogImage.startsWith('http')) { ogImage = nconf.get('url') + ogImage; } res.locals.metaTags.push({ property: 'og:image', content: ogImage }); } var categoryData; async.waterfall([ function(next) { categories.getCategoriesByPrivilege('cid:0:children', req.uid, 'find', next); }, function(_categoryData, next) { categoryData = _categoryData; var allCategories = []; categories.flattenCategories(allCategories, categoryData); categories.getRecentTopicReplies(allCategories, req.uid, next); } ], function(err) { if (err) { return next(err); } var data = { title: '[[pages:categories]]', categories: categoryData }; //console.log("TITE "+data.title); if (req.path.startsWith('/api/categories') || req.path.startsWith('/categories')) { data.breadcrumbs = helpers.buildBreadcrumbs([{ text: data.title }]); } data.categories.forEach(function(category) { if (category && Array.isArray(category.posts) && category.posts.length) { category.teaser = { url: nconf.get('relative_path') + '/topic/' + category.posts[0].topic.slug + '/' + category.posts[0].index, timestampISO: category.posts[0].timestampISO, pid: category.posts[0].pid }; } }); res.render('categories', data); }); };
This is ajaxify.js and the error is at line " app.template=data.template.name"
ajaxify.go = function (url, callback, quiet) { if (!socket.connected) { if (ajaxify.reconnectAction) { $(window).off('action:reconnected', ajaxify.reconnectAction); } ajaxify.reconnectAction = function(e) { ajaxify.go(url, callback, quiet); $(window).off(e); }; $(window).on('action:reconnected', ajaxify.reconnectAction); } if (ajaxify.handleRedirects(url)) { return true; } app.leaveCurrentRoom(); $(window).off('scroll'); if ($('#content').hasClass('ajaxifying') && apiXHR) { apiXHR.abort(); } if (!window.location.pathname.match(/\/(403|404)$/g)) { app.previousUrl = window.location.href; } url = ajaxify.start(url); // If any listeners alter url and set it to an empty string, abort the ajaxification if (url === null) { $(window).trigger('action:ajaxify.end', {url: url, tpl_url: ajaxify.data.template.name, title: ajaxify.data.title}); return false; } console.log("UR "+JSON.stringify(url)); previousBodyClass = ajaxify.data.bodyClass; $('#footer, #content').removeClass('hide').addClass('ajaxifying'); ajaxify.loadData(url, function(err, data) { if (!err || (err && err.data && (parseInt(err.data.status, 10) !== 302 && parseInt(err.data.status, 10) !== 308))) { ajaxify.updateHistory(url, quiet); } if (err) { return onAjaxError(err, url, callback, quiet); } retry = true; //console.log(data); app.template = data.template.name; console.log("DATA "+JSON.stringify(data)); require(['translator'], function(translator) { translator.load(config.defaultLang, data.template.name); renderTemplate(url, data.template.name, data, callback); }); }); return true; };
when the path go on the "/categories" and the method ajaxify.go is called (ajaxify.loadData()) , it returns the HTML code of page and not an object and so it shows me this error.
Anyone can help me to resolve this? -
@doppy said in ERROR: Cannot read property 'name' of undefined when I use ajaxify.go on /categories:
helpers.setupPageRoute(app,'/api/categories', hostMiddleware,[], controllers.renderCategories);
You don't need this, setupPageRoute already creates the api route. https://github.com/NodeBB/NodeBB/blob/master/src/routes/helpers.js#L9
I am not sure if that will fix your problem though. To confirm everything is correct you can go to
/api/categories
and you should get back json data instead of html.