Mon goose не принимает переменные обратного вызова для рендера - PullRequest
0 голосов
/ 03 мая 2020
app.get("/users/:id", function (req, res) {
    User.findById(req.params.id, function (err, foundUser) {
        if (err) {
            console.log(err)
        } else {
            console.log(foundUser)
        }
    })
    Item.countDocuments({ UID: req.params.id }, function (err, itemCount) {
        if (err) {
            console.log(err)
        } else {
            console.log(itemCount)
        }
    })
    Item.find({ UID: req.params.id }, function (err, foundItems) {
        if (err) {
            console.log(err)
        } else {
            console.log(foundItems)
        }

    })
    res.render("users/show", { user: foundUser, newListItems: foundItems, itemCount: itemCount})

По какой-то причине это не рендерится и продолжает говорить, что переменные не существуют, несмотря на обратные вызовы выше. Использование E JS для рендера.

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Возможно, я неправильно читаю код, но не находятся ли переменные обратного вызова вне области действия метода res.render? Возможно, вам придется возвращать обратные вызовы из каждого запроса Mon goose и сохранять их в переменных, которые находятся в области действия метода res.render.

0 голосов
/ 03 мая 2020

Как предложил Rich ie, вы не можете получить доступ к переменным из. Внутри обратных вызовов во внешней области видимости

app.get("/users/:id", function (req, res) { 
    User.findById(req.params.id, function (err, foundUser) { 
        if (err) { console.log(err) } 
        else {
            console.log(foundUser) 

            Item.countDocuments({ UID: req.params.id }, function (err, itemCount) { 
                if (err) { console.log(err) } 
                else { 
                    console.log(itemCount) 
                    Item.find({ UID: req.params.id }, function (err, foundItems){ 
                        if (err) { console.log(err) } 
                        else { 
                        console.log(foundItems);   
                        res.render("users/show", { user: foundUser, newListItems: foundItems, itemCount: itemCount})
                        } 
                    });
                } 
            }); 
        } 
    });
});

Обратите внимание, что я поместил метод res.render внутри обратных вызовов, чтобы переменные доступны для него.

РЕДАКТИРОВАТЬ

В соответствии с предложением Марселя Джамана, вам, вероятно, следует использовать async/await, чтобы сделать код более читабельным. Подробнее о async/await здесь

app.get("/users/:id", async function (req, res) { 
    try {
        const foundUser = await User.findById(req.params.id);
        console.log(foundUser) 

        const itemCount = await Item.countDocuments({ UID: req.params.id });
        console.log(itemCount) 

        const foundItems = await Item.find({ UID: req.params.id });
        console.log(foundItems);   
        res.render("users/show", { user: foundUser, newListItems: foundItems, itemCount: itemCount});
    } catch(err) {
        console.error(err)
    }
});

Вы можете заметить, насколько проще этот код, чем тот, что над ним.

...