Передача данных mongodb в представления через экспресс - PullRequest
0 голосов
/ 05 января 2019

Я создаю ОЧЕНЬ базовое приложение для бронирования автомобиля напрокат, я пытаюсь получить доступ к данным из mongodb, который, кажется, работает, когда он выводится на консоль под нагрузкой. Я не могу получить эту информацию для отображения на мой взгляд. Если я установлю метод рендеринга вне области действия функции, я не смогу получить доступ к данным БД, если я установлю рендер внутри, тогда страница бронирования никогда не загрузится. Я уже несколько дней бездельничаю с одним и тем же блоком кода, и я не испытывал радости.

//------------------------------------------------THE SET UP--------------------------------------------
// set node dependencies
let express = require("express");
let bodyParser = require("body-parser");
let mongoose = require("mongoose");
let connection = mongoose.connection;

let data = mongoose.connect("mongodb://localhost:27017/test")


// allow for encoding od POST DATA
let urlencodedParser = bodyParser.urlencoded({extended: false});

// set up app to extend express
let app = express();

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

// static files
app.use("/assets", express.static("assets"));
//------------------------------------------------------------------------------------------------------

// REDIRECTS BASED ON URL
app.get('/', function(req,res){
    res.render("index")
});

app.get('/booking', function(req,res){
    res.render("booking",{qs:req.query})
});
app.post('/booking',urlencodedParser, function(req,res){
    // Surround this with if !blacklisted to run inner code
    if (req.body.blacklist !== "on"){
        console.log(req.body);

// страница бронирования принимает сведения о возрасте и соответственно перенаправляет / запрашивает базу данных

        if (req.body.age >= 25){

            connection.once('open', function () {

                connection.db.collection("vehicles", function(err, collection){
                    collection.find({}).toArray(function(err, data){
                        console.log(data[0]._id); // it will print collection data
                    })
                });
                res.render("contact-success",{data:req.body})
                connection.close();
            });
        }
        else if (req.body.age < 25 && req.body.age > 17){

            connection.once('open', function () {

                connection.db.collection("vehicles", function(err, collection){
                    collection.find({}).toArray(function(err, data){
                        console.log(data[0]._id + "<25 message"); // it will print collection data
                    })
                })
            })

// THIS IS WHERE I WANT TO PASS THE DB DATA INTO.. so that it redirects to this page and filters the vehicles collection appropriately.

            res.render("contact-failed",{data:req.body});
        }
    }
    else{
        console.log(req.body.firstName , req.body.lastName , "Has been blacklisted!")
        res.render("blacklisted",{data:req.body}); 
    }
    // else if blacklisted redirect to a sorry, contact company page.
});

let port = 3000;

app.listen(port);
console.log("listening on port " + port);

1 Ответ

0 голосов
/ 05 января 2019

Несколько вещей о вашем коде -

  1. Вы должны позвонить res.render() внутри звонка на mongodb.

    connection.once('open', function () {
    
        connection.db.collection("vehicles", function(err, collection){
            collection.find({}).toArray(function(err, data){
                console.log(data[0]._id); // it will print collection data
                res.render("contact-success",{data:req.body})
            });
        });
    
        connection.close();
    });
    
  2. Вы не проверяете наличие ошибок. Если вы получите какую-либо ошибку в запросе, вы не получите ответа на запрос. Поэтому всегда лучше проверять ошибки.

    if(err) {
        // process the error and send appropriate message.
    } else {
        // send what you want to send to view.
        res.render("contact-success",{data:req.body})
    }  
    
  3. У вас есть условия для

    if (req.body.age >= 25){
    ...
    } else if (req.body.age < 25 && req.body.age > 17){
    ...
    }
    

    Но нет ничего более простого. Поэтому, если какое-либо из этих двух условий не будет выполнено, вы не получите ответа на запрос.

  4. В каждом из условий должен быть один res.render() или res.send().

...