Nodejs中node+express浏览器显示的问题

Nodejs中node+express浏览器显示的问题

问题在于每次通过浏览器访问,第一次不会加载数据,要刷新一次过后才会正常加载数据……我用的IE11 请问是怎么回事啊? 代码如下: (我的补充:感觉就好像是第一次访问的时候先执行了res.render()) var _devid, _temp, _light; /* GET home page. */ router.get(’/’, function(req, res) { //var index = tlvalues.find(); var now = moment().format(“H:mm:ss”); var query = tlvalues.find(); query.sort(’-_id’); query.limit(1); query.exec(function(err, doc){ if(err){ console.log(err); } _devid = doc[0].devid; _temp = doc[0].temp; _light = doc[0].light; var h = _temp / 100; console.log(h); console.log(_temp); if(h > 1){ _temp = -(_temp % 100); }else{ _temp %= 100; } console.log(_temp); }) res.render(‘index’, { title: ‘温度-光照强度实时监测’, deviceId: _devid, temp: _temp, light: _light, nowtime: now }); });


3 回复

根据你提供的信息,你遇到的问题可能是由于在第一次请求时,数据库查询还没有完成,而res.render()已经被调用了。这会导致_devid, _temp, 和 _light变量没有被正确赋值,从而导致第一次请求时数据没有正确加载。

为了解决这个问题,你可以将渲染页面的逻辑放在数据库查询回调函数内部,确保在渲染之前数据已经成功获取。以下是修改后的代码示例:

var _devid, _temp, _light;
var now;

/* GET home page. */
router.get('/', function(req, res) {
    now = moment().format("H:mm:ss");
    var query = tlvalues.find();
    query.sort('-_id');
    query.limit(1);
    
    query.exec(function(err, doc) {
        if (err) {
            console.log(err);
            return res.status(500).send('Database error');
        }

        if (!doc || doc.length === 0) {
            return res.render('index', {
                title: '温度-光照强度实时监测',
                deviceId: _devid,
                temp: _temp,
                light: _light,
                nowtime: now
            });
        }

        _devid = doc[0].devid;
        _temp = doc[0].temp;
        _light = doc[0].light;

        var h = _temp / 100;
        console.log(h);
        console.log(_temp);

        if (h > 1) {
            _temp = -(_temp % 100);
        } else {
            _temp %= 100;
        }
        console.log(_temp);

        res.render('index', {
            title: '温度-光照强度实时监测',
            deviceId: _devid,
            temp: _temp,
            light: _light,
            nowtime: now
        });
    });
});

解释

  1. 定义变量:首先定义 _devid, _temp, _light, 和 now 变量。
  2. 获取当前时间:在查询数据库之前,获取当前时间并赋值给 now
  3. 查询数据库:使用 tlvalues.find() 查询数据库,并按时间降序排序,限制结果数量为1。
  4. 处理错误:如果查询过程中发生错误,返回一个错误响应。
  5. 检查结果:如果查询结果为空或不存在,直接渲染页面。
  6. 处理数据:如果查询结果存在,处理数据并赋值给 _devid, _temp, 和 _light
  7. 渲染页面:最后,在数据库查询完成后,渲染页面并传递所需的数据。

通过这种方式,可以确保在渲染页面之前,所有必要的数据都已经从数据库中获取并处理完毕。


已解决。

根据你的描述,这个问题通常是由于异步操作没有完成就调用了 res.render 方法导致的。在你的代码中,query.exec 是一个异步操作,这意味着在数据库查询还没有完成之前,res.render 已经被调用了。因此,第一次访问时 _devid, _temp, 和 _light 可能是未定义的,导致数据没有正确加载。

为了确保在渲染页面之前完成了数据库查询,你需要将 res.render 放到回调函数中。以下是修改后的代码:

var _devid, _temp, _light;

router.get('/', function(req, res) {
    var now = moment().format("H:mm:ss");
    
    var query = tlvalues.find();
    query.sort('-_id');
    query.limit(1);
    
    query.exec(function(err, doc) {
        if (err) {
            console.log(err);
            return res.status(500).send('Error fetching data from database.');
        }
        
        _devid = doc[0].devid;
        _temp = doc[0].temp;
        _light = doc[0].light;
        var h = _temp / 100;
        
        if (h > 1) {
            _temp = -(_temp % 100);
        } else {
            _temp %= 100;
        }
        
        res.render('index', {
            title: '温度-光照强度实时监测',
            deviceId: _devid,
            temp: _temp,
            light: _light,
            nowtime: now
        });
    });
});

这样可以确保在渲染页面之前,数据库查询已经完成,并且 _devid, _temp, 和 _light 已经被正确赋值。这样应该可以解决第一次访问时不加载数据的问题。

回到顶部