मैं एक ब्लॉगिंग एप्लिकेशन पर काम कर रहा हूं। मजबूत>गिटहब रेपो) के साथ Express, EJS और MongoDB।

एक कारण से मैं पहचानने में असमर्थ रहा हूं, जब (ब्राउज़र में) मैं यहां जाने की कोशिश करता हूं: http://localhost:3000/dashboard यह (ब्राउज़र) लोडिंग स्थिति में फंस जाता है और वास्तव में कभी भी डैशबोर्ड रूट लोड नहीं करता है।

"एंट्री" index.js फ़ाइल में मेरे पास है:

const express = require('express');
const dotenv = require('dotenv');
const mongoose = require('mongoose');
const path = require('path');
const morgan = require('morgan');
const expressLayouts = require('express-ejs-layouts');
const app = express();

dotenv.config();

//Conect to MONGODB
mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => {
    console.log('conected');
});

mongoose.connection.on('error', err => {
    console.log(`DB connection error: ${err.message}`);
});

// Set static directory
app.use(express.static(path.join(__dirname, 'public')));

// Set views directory
app.set('views', path.join(__dirname, 'views'));

// Set view engine
app.set('view engine', 'ejs');

// Use Express Layouts
app.use(expressLayouts);

// Middleware
app.use(morgan('dev'));

// Bring the Posts Routes
const postsRoute = require('./routes/front-end/posts');

// Get Posts
app.use('/', postsRoute);

// Get Single Post
app.use('/:id', postsRoute);

// Bring the Dashboard
const dashboardRoute = require('./routes/admin/dashboard');

// Get Dashboard
app.use('/dashboard', dashboardRoute);

const port = process.env.PORT || 3000;

app.listen(port, () => console.log(`Listening on port ${port}!`));

डैशबोर्ड रूट (रूट्स\admin\dashboard.js) में मेरे पास है:

const express = require('express');
const dashboardController = require('../../controllers/admin/dashboard');

// Express router
const router = express.Router();

// Dysplay Dashboard
router.get('/dashboard', dashboardController.displayDashboard);

module.exports = router;

डैशबोर्ड नियंत्रक में रहते हुए:

const Post = require('../../models/post');

exports.displayDashboard = (req, res, next) => {
    res.send('Dashboard');
};

routes/front-end/posts.js में मेरे पास है:

const express = require('express');
const postsController = require('../../controllers/front-end/posts');

// Express router
const router = express.Router();

// Get Posts
router.get('/', postsController.getPosts);

// Get Single Post
router.get('/:id', postsController.getSinglePost);

module.exports = router;

पोस्ट नियंत्रक:

const Post = require('../../models/post');

exports.getPosts = (req, res, next) => {
    const posts = Post.find({}, (err, posts) => {
        if(err){
            console.log('Error: ', err);
        } else {
            res.render('default/index', {
                layout: 'default/layout',
                website_name: 'MEAN Blog',
                page_heading: 'XPress News',
                page_subheading: 'A MEAN Stack Blogging Application',
                posts: posts
            });
        }
    });
};

exports.getSinglePost = (req, res, next) => {
    let id = req.params.id;
    if (id.match(/^[0-9a-fA-F]{24}$/)) {
        Post.findById(id, function(err, post){
            if(err){
                console.log('Error: ', err);
            } else {
                res.render('default/singlepost', {
                    layout: 'default/layout',
                    website_name: 'MEAN Blog',
                    post: post
                });
            }
        });
    }
};

महत्वपूर्ण: यह आवश्यक है कि प्रत्येक एकल पोस्ट रूट url के अंतर्गत प्रदर्शित हो, उदाहरण के लिए: http://localhost:3000/5e3063dbfa749d9229bab26f जहां 5e3063dbfa749d9229bab26f, निश्चित रूप से पोस्ट आईडी है।

यह एसईओ उद्देश्यों के लिए है। मैं बाद में आईडी को स्लग: http://localhost:3000/my-great-post से बदलने का इरादा रखता हूं।

इसे कैसे प्राप्त किया जा सकता है?

0
Razvan Zamfir 4 फरवरी 2020, 12:42

10 जवाब

सबसे बढ़िया उत्तर

फिक्स्ड आईटी, संपूर्ण रनिंग उदाहरण के लिए क्लोन नोड-चीट XPressBlog और चलाएं node index उसके बाद npm i

ब्राउज़र को http://localhost:3000/dashboard पर इंगित करें, आउटपुट:

यह डैशबोर्ड है

http://localhost:3000, आउटपुट:

यह सभी पदों को लोड करेगा; अपने तर्क के साथ जारी रखें!

http://localhost:3000/my-great-post , आउटपुट:

यह स्लग के साथ सिंगल पोस्ट लोड करेगा : my-great-post

आप क्या गलत कर रहे थे?

आप app.use( के उपयोग को भ्रमित कर रहे थे, इसलिए वे आपकी आवश्यकताओं के अनुसार तय किए गए हैं (जैसा कि आपकी पोस्ट में बताया गया है) इस तरह:

const dashboardRoute = require("./routes/admin/dashboard");
app.use('/dashboard', dashboardRoute);

const postsRoute = require('./routes/front-end/posts');
app.use('/', postsRoute);

यदि आप app.use के बारे में अधिक जानना चाहते हैं तो ये लिंक हैं:

1
Zeeshan Hassan Memon 26 फरवरी 2020, 09:11

पहले तो, app.use('/:id', postsRoute); और app.use('/dashboard', dashboardRoute); ब्राउज़र के लिए समान हैं। क्योंकि जब ब्राउज़र को '/ डैशबोर्ड' मिलता है, तो यह नहीं जानता कि स्ट्रिंग 'डैशबोर्ड' एक आईडी है या नहीं। उसके कारण, यह अटक जाता है क्योंकि URL इन दोनों मार्गों को इंगित करता है। इसलिए app.use('/:id', postsRoute); को app.use('/post/:id', postsRoute); में बदलें। यह ठीक काम करेगा।

दूसरे, आपके कोड के अनुसार URL http://localhost:3000/dashboard/dashboard होना चाहिए, न कि http://localhost:3000/dashboard

Index.js

const express = require('express');
const dotenv = require('dotenv');
const mongoose = require('mongoose');
const path = require('path');
const morgan = require('morgan');
const expressLayouts = require('express-ejs-layouts');
const app = express();

dotenv.config();

//Conect to MONGODB
mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => {
    console.log('conected');
});

mongoose.connection.on('error', err => {
    console.log(`DB connection error: ${err.message}`);
});

// Set static directory
app.use(express.static(path.join(__dirname, 'public')));

// Set views directory
app.set('views', path.join(__dirname, 'views'));

// Set view engine
app.set('view engine', 'ejs');

// Use Express Layouts
app.use(expressLayouts);

// Middleware
app.use(morgan('dev'));

// Bring the Posts Routes
const postsRoute = require('./routes/front-end/posts');

// Get Posts
app.use('/', postsRoute);

// Get Single Post
app.use('/post/:id', postsRoute); //****changed******

// Bring the Dashboard
const dashboardRoute = require('./routes/admin/dashboard');

// Get Dashboard
app.use('/dashboard', dashboardRoute);

const port = process.env.PORT || 3000;

app.listen(port, () => console.log(`Listening on port ${port}!`));
1
Fathma Siddique 25 फरवरी 2020, 14:10

Index.js में आप रूट एक्सपोर्ट को "/" में जोड़ रहे हैं, एक्सप्रेस रूट्स में पाथ रेगुलर एक्सप्रेशन से मेल खाएंगे। इसलिए जब राउटर को "/" में जोड़ा जाता है तो सब कुछ यहीं से शुरू हो जाएगा।

// Bring the Posts Routes
const postsRoute = require('./routes/front-end/posts');

// Get Posts
app.use('/', postsRoute);

// Get Single Post
app.use('/:id', postsRoute);

// Bring the Dashboard
const dashboardRoute = require('./routes/admin/dashboard');

// Get Dashboard
app.use('/dashboard', dashboardRoute);

यहां क्या हो रहा है आनंद पहले अब मार्ग इस तरह बन गया

/ आपने पोस्ट रूट जोड़े

तो अब रास्ते बन जाते हैं

/ - सभी पोस्ट देगा /:id - सिंगल पोस्ट देगा

फिर से आपने ":/id" में पोस्ट रूट जोड़े /:id - पोस्टरूट

तो अब रास्ते बन जाते हैं

/:id सभी पोस्ट देगा /:id/:id सिंगल पोस्ट देंगे

तो आपको उनमें से कोई एक लाइन हटानी होगी

इसे ही ठीक करें

// Get Posts
app.use('/', postsRoute);

और आपके डैशबोर्ड के लिए आपने वही काम किया है

app.use('/dashboard', dashboardRoute);

अब रास्ते बन जाते हैं

/dashboard/dashboard - यह डैशबोर्ड देगा

लेकिन यह "/:id/:id" रूटिंग मिलान को ओवरराइड कर देता है, इसलिए अब कुछ भी इसे ओवरराइड करता है

इसलिए app.use("/posts", postsRoute); जैसी पोस्ट पाने के लिए दूसरा रास्ता बनाएं

/posts -> यह सभी पोस्ट देगा

/posts/:id -> यह एक ही जानकारी देगा


और डैशबोर्ड मार्ग जिन्हें आपको बदलने की आवश्यकता है

router.get('/dashboard', dashboardController.displayDashboard);

/dashboard -> "/"

router.get('/', dashboardController.displayDashboard);

अंतिम मार्ग होंगे

const postsRoute = require('./routes/front-end/posts');

// Get Posts
app.use('/posts', postsRoute);

// Get Single Post
// THIS ONE WILL COMMENT 
// app.use('/posts/:id', postsRoute);

// Bring the Dashboard
const dashboardRoute = require('./routes/admin/dashboard');

// Get Dashboard
app.use('/dashboard', dashboardRoute);

डैशबोर्ड मार्गों में

router.get('/', dashboardController.displayDashboard);
1
Razvan Zamfir 25 फरवरी 2020, 15:49

आप अपनी index.js फ़ाइल में अपने मार्गों को सही ढंग से कॉन्फ़िगर नहीं कर रहे हैं। ये कोशिश करें:

const express = require("express");
const dotenv = require("dotenv");
const mongoose = require("mongoose");
const path = require("path");
const morgan = require("morgan");
const expressLayouts = require("express-ejs-layouts");
const app = express();

dotenv.config();

//Conect to MONGODB
mongoose
  .connect(process.env.MONGO_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true
  })
  .then(() => {
    console.log("conected");
  });

mongoose.connection.on("error", err => {
  console.log(`DB connection error: ${err.message}`);
});

// Set static directory
app.use(express.static(path.join(__dirname, "public")));

// Set views directory
app.set("views", path.join(__dirname, "views"));

// Set view engine
app.set("view engine", "ejs");

// Use Express Layouts
app.use(expressLayouts);

// Middleware
app.use(morgan("dev"));

// Bring the Posts Routes
const postsRoute = require('./routes/front-end/posts');

const dashboardRoute = require("./routes/admin/dashboard");

// Get Dashboard
app.use('/dashboard', dashboardRoute);

// Get Posts
app.use('/', postsRoute);

const port = process.env.PORT || 8080;

app.listen(port, () => console.log(`Example app listening on port ${port}!`));

आपको दो पोस्ट रूट्स का उपयोग करने की आवश्यकता नहीं है। इसे जांचें: https://expressjs.com/en/guide/routing.html

इसके अलावा, मेरा सुझाव है कि आप अपना पोस्ट रूट इस तरह जोड़ें: app.use('/post, postsRoute).

1
Vinay Shrestha 26 फरवरी 2020, 06:44

/:id और /dashboard के क्रम को बदलकर आपकी रूटिंग समस्या को ठीक किया जा सकता है।

const express = require('express');
const dotenv = require('dotenv');
const mongoose = require('mongoose');
const path = require('path');
const morgan = require('morgan');
const expressLayouts = require('express-ejs-layouts');
const app = express();

dotenv.config();

//Conect to MONGODB
mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => {
    console.log('conected');
});

mongoose.connection.on('error', err => {
    console.log(`DB connection error: ${err.message}`);
});

// Set static directory
app.use(express.static(path.join(__dirname, 'public')));

// Set views directory
app.set('views', path.join(__dirname, 'views'));

// Set view engine
app.set('view engine', 'ejs');

// Use Express Layouts
app.use(expressLayouts);

// Middleware
app.use(morgan('dev'));

// Bring the Posts Routes
const postsRoute = require('./routes/front-end/posts');

// Get Posts
app.use('/', postsRoute);

///////////////////////UPDATED PART/////////////////////////////////////
// Bring the Dashboard
const dashboardRoute = require('./routes/admin/dashboard');

// Get Dashboard
app.use('/dashboard', dashboardRoute);

// Get Single Post
app.use('/:id', postsRoute);
////////////////////////////////////////////////////////////////////////


const port = process.env.PORT || 3000;

app.listen(port, () => console.log(`Listening on port ${port}!`));
1
Mazen 26 फरवरी 2020, 06:44

अपनी प्रविष्टि फ़ाइल index.js में, आप गलत तरीके से मार्गों का पंजीकरण कर रहे हैं।

मार्गों को पंजीकृत करने के लिए, आपको app.use() का उपयोग करना होगा न कि app.get() का

इसलिए app.get('/', postsRoute); को app.use('/', postsRoute); में बदलें

मुझे बताएं क्या यह काम आया।

संपादित करें: फिर से देखने के बाद मैंने देखा कि आप मार्ग में दो बार उपसर्ग "डैशबोर्ड" जोड़ रहे हैं।

तो लाइन बदलें: app.get('/dashboard', dashboardRoute);

प्रति

app.use('/', dashboardRoute);

0
properchels 4 फरवरी 2020, 13:19

इसका एक ही कारण है कि आप get का दो बार उपयोग कर रहे हैं। पहला आपके index.js में और दूसरा आपके dashboard.js में। आपको ऐसा नहीं करना चाहिए।

इसलिए, इसे ठीक करने के लिए, सुनिश्चित करें कि आपके index.js में app.get का उपयोग न करें:

app.get('/dashboard', dashboardRoute);

केवल app.use का उपयोग करें:

// Get Dashboard
app.use('/dashboard', dashboardRoute);

अपने index.js में सेट app.use('/dashboard') का उपयोग करने के बाद, सुनिश्चित करें कि आप अपने dashboard.js में नीचे दिए गए कोड को पसंद करें:

const express = require('express');
const dashboardController = require('../../controllers/admin/dashboard');

// Express router
const router = express.Router();

// Dysplay Dashboard
router.get('/', dashboardController.displayDashboard);

module.exports = router;

अब, आप अपने समापन बिंदु को url: localhost:3000/dashboard से कॉल कर सकते हैं।

अपने कोड के उदाहरण के लिए, आप मेरा कोडसैनबॉक्स देख सकते हैं: https:// codesandbox.io/s/express-ejs-bug-answer-0nyo9

उम्मीद है यह आपकी मदद कर सकता है।

0
Titus Sutio Fanpula 4 फरवरी 2020, 15:20

आप 2 फ़िल्टर लगा रहे हैं.

पहले app.get('/dashboard', dashboardRoute); में और फिर router.get('/dashboard', dashboardController.displayDashboard); में।

तो आप शायद http://localhost:3000/dashboard/dashboard रूट बना रहे हैं

उनमें से किसी एक से फ़िल्टर हटाने का प्रयास करें

0
Serhiy Mamedov 4 फरवरी 2020, 20:05

app.get('/dashboard', dashboardRoute); के बाद app.get('/:id', postsRoute); लिखने का प्रयास करें

जब http://localhost:3000/dashboard url को कॉल किया जाता है तो वह dashboardRoute के बजाय postRoute रूट को कॉल करेगा, क्योंकि एक्सप्रेस '/डैशबोर्ड' को '/:id' के रूप में पहचान लेगा, इसलिए req.params.id बराबर होना चाहिए postRoute के अंदर 'डैशबोर्ड'

0
Ashot Arzumanyan 4 फरवरी 2020, 21:09

आपको अपने मार्गों को पुनर्गठित करने की आवश्यकता है। आपका ऐप आर्किटेक्चर भ्रमित करने वाला लगता है। यदि आप एक्सप्रेस राउटर का उपयोग कर रहे हैं तो आपको ऐसा कुछ करने की ज़रूरत है:

आपका index.js

...
const routes = require('./routes/index');
... 
// Middleware
app.use(morgan('dev'));

app.use('/', routes);

const port = process.env.PORT || 3000;

आपको मार्ग/index.js फ़ाइल बनानी होगी जिसमें कुछ इस प्रकार हो:

const express = require('express');
const router = express.Router();
const dashboardController = require('../controllers/admin/dashboard');
const postsController = require('../controllers/front-end/posts');

// Get Posts
router.get('/posts', postsController.getPosts);

// Get Single Post
router.get('/posts/:id', postsController.getSinglePost);

// Display Dashboard
router.get('/dashboard', dashboardController.displayDashboard);

module.exports = router;
0
Evgeniy Grabelsky 5 फरवरी 2020, 17:29