diff --git a/nuxt.config.js b/nuxt.config.js index 6a960cb..d019acd 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -72,11 +72,10 @@ export default { }, axios: { - proxy: true - }, - proxy: { - // SSR axios requests must hit the same Nuxt process that hosts serverMiddleware (/api). - '/api': { target: `http://127.0.0.1:${nuxtPort}` } + // SSR calls the integrated Express API directly; browser uses relative /api paths. + proxy: false, + baseURL: `http://127.0.0.1:${nuxtPort}`, + browserBaseURL: '/' }, router: { linkActiveClass: 'active-link', @@ -85,7 +84,7 @@ export default { serverMiddleware: ['~/server/index.js'], server: { host: '0.0.0.0', - port: 3000 + port: nuxtPort }, auth: { diff --git a/package-lock.json b/package-lock.json index bea9b30..55e0f22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12522,21 +12522,6 @@ "url": "https://opencollective.com/mongoose" } }, - "node_modules/mongoose-lean-virtuals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mongoose-lean-virtuals/-/mongoose-lean-virtuals-1.1.1.tgz", - "integrity": "sha512-8chOqpVE3bcoWT2pIgcJeIZlXaOfQCavZgQZF4qytUtjRBqsNMyzUoR16qdw9XL2kC478N8iA8z0AA+NSS0d1A==", - "license": "Apache 2.0", - "dependencies": { - "mpath": "^0.8.4" - }, - "engines": { - "node": ">=16.20.1" - }, - "peerDependencies": { - "mongoose": ">=5.11.10" - } - }, "node_modules/mongoose-legacy-pluralize": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", @@ -12547,13 +12532,10 @@ } }, "node_modules/mongoose-paginate-v2": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/mongoose-paginate-v2/-/mongoose-paginate-v2-1.9.5.tgz", - "integrity": "sha512-sgPbV0G7SfdW1XdEuNMokzJOT85GNx786itp6UiNmDvKGyxMSHbeyn4tMZBseOmGu2uOo5ByVgfjhaxkOBY71A==", + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/mongoose-paginate-v2/-/mongoose-paginate-v2-1.3.18.tgz", + "integrity": "sha512-MTEyXvQmUNlXyPGophxILHTYQQ80r3uMtgdnKVr+4qgWLM6JxHbWsFpCmaJJ7ofuV7bhkfBTGx3EDoJo+bIKFw==", "license": "MIT", - "dependencies": { - "mongoose-lean-virtuals": "^1.1.0" - }, "engines": { "node": ">=4.0.0" } diff --git a/pages/_lang/index.vue b/pages/_lang/index.vue index bbe958b..7b4a2b0 100644 --- a/pages/_lang/index.vue +++ b/pages/_lang/index.vue @@ -1030,7 +1030,12 @@ export default { blogPosts: blogPosts.data } } catch (e) { - console.error('Homepage asyncData failed:', e.message || e) + console.error('Homepage asyncData failed:', { + url: e.config?.url, + status: e.response?.status, + data: e.response?.data, + message: e.message + }) error({ statusCode: 500, message: 'there is a problem here' }) } } diff --git a/server/controllers/blogPostController.js b/server/controllers/blogPostController.js index edd4e9f..f77b226 100644 --- a/server/controllers/blogPostController.js +++ b/server/controllers/blogPostController.js @@ -112,25 +112,39 @@ module.exports.getAll = [ // '/api/public/blogPosts?limit=4' --> gets only 4 published post of all categories // '/api/public/blogPosts?category=${encodeURIComponent(categoryTitle)}&page=${pageNumber}' --> gets posts depend on the category title and in chunked data - if (req.query.category) { - try { - const categoryID = await BlogCategory.findOne({$or: [{'locale.fa.title': req.query.category}, {'locale.en.title': req.query.category}]}) - const filter = req.query.category === 'all' ? {published: true} : {published: true, category: categoryID._id} - BlogPost.paginate(filter, {page: req.query.page, limit: blogPaginateLimit, populate: 'category', sort: {_id: -1}}, (err, posts) => { - if (err) return res500(res, {message: _sr['fa'].not_found.item_id}) - return res.json(posts) + try { + if (req.query.category) { + const filter = {published: true} + if (req.query.category !== 'all') { + const category = await BlogCategory.findOne({ + $or: [ + {'locale.fa.title': req.query.category}, + {'locale.en.title': req.query.category} + ] + }) + if (!category) return res404(res, _sr['fa'].not_found.item_id) + filter.category = category._id + } + const posts = await BlogPost.paginate(filter, { + page: Number(req.query.page) || 1, + limit: blogPaginateLimit, + populate: 'category', + sort: {_id: -1} }) - } catch (e) { - return res500(res, e) + return res.json(posts) } - } else { - let query = {published: true} + + const query = {published: true} if (req.query.getAll) delete query.published - const limit = Number(req.query.limit) || false - BlogPost.find(query).sort({_id: -1}).limit(limit).populate('category').exec((err, posts) => { - if (err) return res500(res, err) - else return res.json(posts) - }) + const limit = Number(req.query.limit) || 0 + const posts = await BlogPost.find(query) + .sort({_id: -1}) + .limit(limit) + .populate('category') + return res.json(posts) + } catch (e) { + console.error('blogPost getAll error:', e) + return res500(res, e) } } ] diff --git a/server/index.js b/server/index.js index d271758..cb57119 100644 --- a/server/index.js +++ b/server/index.js @@ -25,6 +25,14 @@ app.use('/public', Public) app.use('/auth', auth) app.use('/admin', isAdmin, admin) +app.get('/health', (req, res) => { + res.json({ ok: true }) +}) + +app.use((err, req, res, next) => { + console.error('Express error:', req.method, req.originalUrl, err?.message || err) + res.status(500).json({ message: err?.message || 'Internal Server Error' }) +}) // Export the server middleware module.exports = { diff --git a/server/plugins/controllersHelperFunctions.js b/server/plugins/controllersHelperFunctions.js index 9482339..34afa5f 100644 --- a/server/plugins/controllersHelperFunctions.js +++ b/server/plugins/controllersHelperFunctions.js @@ -3,7 +3,8 @@ module.exports.res404 = (res, err) => { } module.exports.res500 = (res, err) => { - return res.status(500).json({message: err}) + console.error('API 500:', err?.message || err) + return res.status(500).json({message: err?.message || err}) } module.exports.checkValidations = validationResult => {