задержка между моей функцией и перенаправлением на маршрут - PullRequest
0 голосов
/ 28 января 2019

Я работаю над страницей в nodeJs с Express, которая возвращает мне таблицу.У меня есть ошибка, связанная с моей переменной "allMusique", содержащей мои данные на моей странице, когда я пытаюсь получить к ней доступ, но после однократной перезагрузки страница корректно отображается с моими данными.Кто-нибудь видит, что не так, пожалуйста?

Вот мой код:

var express = require('express');
var router = express.Router();
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
var allMusique;
var idMaxMusique;

router.get('/', function(req, res, next) {
    function getAllMusique(){
        MongoClient.connect(url, function(err, db) {
            if (err) throw err;
            var dbo = db.db("projet_node");
            dbo.collection("musiques").find({}).toArray(function(err, result) {
                if (err) throw err;
                allMusique = result;
                var size = allMusique.length-1;
                idMaxMusique = parseInt(result[size].id)+1;
            });
        });
    }

    getAllMusique();
    res.render('musiques', { resultat: allMusique, idMax: idMaxMusique });
});

module.exports = router;

Ответы [ 3 ]

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

getAllMusique - асинхронная функция.Вам просто нужно переместить рендер в обратный вызов

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

Одно из решений также использует async / await.

router.get('/', async function(req, res, next) {

//...

await getAllMusique();
res.render('musiques', { resultat: allMusique, idMax: idMaxMusique });

}

Обратите внимание, что обратный вызов в .get() теперь async, и это позволяет await вашей функции.

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

При первом вызове res.render переменная allMusique еще не установлена, так как она не ожидала завершения доступа к базе данных, со второй попытки она уже записана из-за первого доступа.

Я рекомендую вызывать res.render внутри Mongoclient.connect

router.get('/', function(req, res, next) {
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("projet_node");
        dbo.collection("musiques").find({}).toArray(function(err, result) {
            if (err) throw err;
            allMusique = result;
            var size = allMusique.length-1;
            idMaxMusique = parseInt(result[size].id)+1;
            res.render('musiques', { resultat: allMusique, idMax: idMaxMusique });
        });
    });
});

, если вы действительно хотите сохранить структуру, вы можете сделать res.render в функции обратного вызова

function getAllMusique(callbackFunction){
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("projet_node");
        dbo.collection("musiques").find({}).toArray(function(err, result) {
            if (err) throw err;
            allMusique = result;
            var size = allMusique.length-1;
            idMaxMusique = parseInt(result[size].id)+1;
            callbackFunction();
        });
    });
}

getAllMusique(()=>res.render('musiques', { resultat: allMusique, idMax: idMaxMusique }));

илизаставить функцию возвращать обещание, когда значение уже записано

function getAllMusique(){
    return new Promise((resolve, reject) => {
        MongoClient.connect(url, function(err, db) {
            if (err) throw err;
            var dbo = db.db("projet_node");
            dbo.collection("musiques").find({}).toArray(function(err, result) {
                if (err) throw err;
                allMusique = result;
                var size = allMusique.length-1;
                idMaxMusique = parseInt(result[size].id)+1;
                resolve();
            });
        });
    });
}

getAllMusique().then(()=>res.render('musiques', { resultat: allMusique, idMax: idMaxMusique }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...