【问题标题】:delay between my function and the redirection to a route我的函数和重定向到路由之间的延迟
【发布时间】:2019-01-28 13:34:12
【问题描述】:

我正在使用 express 处理 nodeJs 中的一个页面,该页面返回给我一个表格。当我尝试访问它时,我的变量“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;

【问题讨论】:

标签: javascript node.js express routes


【解决方案1】:

第一次调用 res.render 时,变量 allMusique 尚未设置,因为它没有等待数据库访问完成,在第二次尝试时,由于第一次访问,它已经写入。

我建议在 Mongoclient.connect 中调用 res.render

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 }));

【讨论】:

    【解决方案2】:

    getAllMusique 是一个异步函数。您只需要将渲染移到回调中

    【讨论】:

      【解决方案3】:

      其中一个解决方案也是使用 async/await。

      router.get('/', async function(req, res, next) {
      
      //...
      
      await getAllMusique();
      res.render('musiques', { resultat: allMusique, idMax: idMaxMusique });
      
      }
      

      请注意,.get() 中的回调现在是 async,这允许您 await 您的函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-17
        相关资源
        最近更新 更多