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 }); });
根据你提供的信息,你遇到的问题可能是由于在第一次请求时,数据库查询还没有完成,而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
});
});
});
解释
- 定义变量:首先定义
_devid
,_temp
,_light
, 和now
变量。 - 获取当前时间:在查询数据库之前,获取当前时间并赋值给
now
。 - 查询数据库:使用
tlvalues.find()
查询数据库,并按时间降序排序,限制结果数量为1。 - 处理错误:如果查询过程中发生错误,返回一个错误响应。
- 检查结果:如果查询结果为空或不存在,直接渲染页面。
- 处理数据:如果查询结果存在,处理数据并赋值给
_devid
,_temp
, 和_light
。 - 渲染页面:最后,在数据库查询完成后,渲染页面并传递所需的数据。
通过这种方式,可以确保在渲染页面之前,所有必要的数据都已经从数据库中获取并处理完毕。
已解决。
根据你的描述,这个问题通常是由于异步操作没有完成就调用了 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
已经被正确赋值。这样应该可以解决第一次访问时不加载数据的问题。