使用 express 和 EJS 动态显示图像
Display dynamically an image using express and EJS
我有一个包含不同 URL 图像的集合。我检索了我想要的 URL 并希望将其传递给 jade 模板,例如:
app.get('/',function(req,res){
mongoDB.getUsedHomePageOne(function(err, result){
if(!err){
console.log("getUsedHomePageOne : ");
console.log(result);
app.locals['homePageImg'] = result.url;
}
});
app.render('userPageEjs.html',function(err,renderedData){
console.log(renderedData);
res.send(renderedData);
});
});
getUsedHomePageOne 看起来像:
DBMongo.prototype.getUsedHomePageOne = function(callback){
this.homePageColl.findOne({used:1}, callback);
};
在翡翠模板中:
<img src="<%= homePageImg %>"/>
所以这不会工作,除非我加载两次页面,我假设是因为它被缓存并且计算得足够快或其他什么。
正确的做法是什么?
PS: 我第二次加载页面时,一切都会正确加载。
PS2:我不想延迟图像的渲染,我想在图像准备好后加载,但无论如何先渲染HTML页面。
根据我在您的代码中收集到的信息:
app.get('/',function(req,res){
mongoDB.getUsedHomePageOne(function(err, result){
if(!err){
console.log("getUsedHomePageOne : ");
console.log(result);
app.locals['homePageImg'] = result.url;
app.render('userPageEjs.html',function(err,renderedData){
console.log(renderedData);
res.send(renderedData);
});
}
});
});
基本上,您对数据库有一个异步函数,您可以在等待数据库函数完成之前快速呈现模板。使用异步函数时的正常模式,其结果应该在行中使用,您必须在异步函数中调用下一个函数。但是,这可能会导致回调地狱(类似于我在上面编写修复程序的方式),因此通常首选像 Promises 或 async.js 这样的替代方法。
我有一个包含不同 URL 图像的集合。我检索了我想要的 URL 并希望将其传递给 jade 模板,例如:
app.get('/',function(req,res){
mongoDB.getUsedHomePageOne(function(err, result){
if(!err){
console.log("getUsedHomePageOne : ");
console.log(result);
app.locals['homePageImg'] = result.url;
}
});
app.render('userPageEjs.html',function(err,renderedData){
console.log(renderedData);
res.send(renderedData);
});
});
getUsedHomePageOne 看起来像:
DBMongo.prototype.getUsedHomePageOne = function(callback){
this.homePageColl.findOne({used:1}, callback);
};
在翡翠模板中:
<img src="<%= homePageImg %>"/>
所以这不会工作,除非我加载两次页面,我假设是因为它被缓存并且计算得足够快或其他什么。
正确的做法是什么?
PS: 我第二次加载页面时,一切都会正确加载。
PS2:我不想延迟图像的渲染,我想在图像准备好后加载,但无论如何先渲染HTML页面。
根据我在您的代码中收集到的信息:
app.get('/',function(req,res){
mongoDB.getUsedHomePageOne(function(err, result){
if(!err){
console.log("getUsedHomePageOne : ");
console.log(result);
app.locals['homePageImg'] = result.url;
app.render('userPageEjs.html',function(err,renderedData){
console.log(renderedData);
res.send(renderedData);
});
}
});
});
基本上,您对数据库有一个异步函数,您可以在等待数据库函数完成之前快速呈现模板。使用异步函数时的正常模式,其结果应该在行中使用,您必须在异步函数中调用下一个函数。但是,这可能会导致回调地狱(类似于我在上面编写修复程序的方式),因此通常首选像 Promises 或 async.js 这样的替代方法。