我的nodejs项目有一个非常奇怪的问题。该项目是一个带快递和车把的在线商店,它有一个连接的mongo数据库。在路由器部分,我有这个代码:
router.get('/item/:item', function (req, res, next) {
var actItem = {};
Item.find().findOne({ '_id': req.params.item }, function (err, item) {
actItem.name = item.item_name;
actItem.price = item.price;
actItem.description = item.description;
actItem.imageLink = item.imageLink;
});
res.render('pages/shop/item-view', { title: 'Express', item: actItem });
});
它在数据库的URL中查找项ID,并返回传递要显示的数据的视图。它工作正常,但在视图中我有这个代码:
<div id="carouselExampleControls" class="carousel slide" data-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<img class="d-block w-100" src="{{item.imageLink}}" alt="First slide">
</div>
<div class="carousel-item">
<img class="d-block w-100" src="" alt="Second slide">
</div>
<div class="carousel-item">
<img class="d-block w-100" src="" alt="Third slide">
</div>
</div>
<a class="carousel-control-prev" href="#carouselExampleControls" role="button" data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" href="#carouselExampleControls" role="button" data-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
它也很好用!但问题来了。每当我在任何src属性中添加三个点时,它就会崩溃。甚至更奇怪的是,即使我在chrome中渲染后编辑html文档并添加它们,它也会崩溃,如下所示:
<img class="d-block w-100" src="..." alt="Second slide">
崩溃的错误是这样的:
actItem.name = item.item_name;
^
TypeError: Cannot read property 'item_name' of undefined
关于如何解决这个问题及其发生原因的任何想法?
我设法通过在执行任何操作之前检查项目来解决此问题。
if (item) {
actItem.name = item.item_name;
actItem.price = item.price;
actItem.description = item.description;
actItem.imageLink = item.imageLink;
}
这是因为当我使用...浏览器使请求/项目/ ...获取图像时,req.params.item的值变为......并且在数据库中没有带有_id的条目= ....所以项目值很难定义
答案 0 :(得分:2)
findOne
是异步函数,因此在其中调用res.render
,并检查item是否为null:
router.get('/item/:item', function (req, res, next) {
var actItem = {};
Item.find().findOne({ '_id': req.params.item }, function (err, item) {
if(item){
actItem.name = item.item_name;
actItem.price = item.price;
actItem.description = item.description;
actItem.imageLink = item.imageLink;
res.render('pages/shop/item-view', { title: 'Express', item: actItem
}
else{
res.render('pages/shop/item-view', { title: 'Express', item: 'defaultValue'});
}
});
});