猫鼬找到下一个对象

时间:2018-11-22 19:57:33

标签: javascript node.js mongoose

我正在创建一个摄影网站,最终我想向用户添加该功能,以便用户查看数据库中的下一张照片。我是Web开发的新手,因此想逐步进行操作,因此,如果现在在控制台中显示下一张照片的ID,就足够了。这是我现在使用的代码:

var getPhoto = require("../public/modules/getPhoto")

router.get("/:id/next", function(req, res){
    getPhoto.next();
    res.redirect("/");
})

var Photo = require("../../models/photo");
var exports = module.exports = {};

exports.next = function(callback){
    console.log(Photo.find({}).sort({_id: 1 }).limit(1)._id);
}

但是,这只会返回undefined

我读过here,我需要使用回调,但是即使使用链接示例中给出的代码,我也不知道如何实现。

如何将下一张照片的ID打印到控制台?

修改 我的代码现在看起来像这样:

// NEXT PHOTO - shows next photo 
router.get("/:id/next", function(req, res){
    Photo.find({}).sort({ _id: 1 }).limit(1).then(function(docs){ 
        console.log(docs[0]._id)
        res.redirect("/photos/" + docs[0]._id)
    })
})

// PREVIOUS PHOTO - shows previous photo 
router.get("/:id/previous", function(req, res){
    Photo.find({}).sort({ _id: -1 }).limit(1).then(function(docs){ 
        console.log(docs[0]._id)
        res.redirect("/photos/" + docs[0]._id)
    })
})

但是,这仅给我数据库中的第一项或最后一项。根据{{​​3}}链接,我必须用{ _id: -1 }代替{_id: {$gt: curId}}。我没有使用jQuery,那么该如何重写呢?

1 个答案:

答案 0 :(得分:0)

您需要了解回调和Promises。但是对于您的答案,您可以像这样利用猫鼬exec

exports.next = function() {
    return new Promise((resolve, reject) => {
        Photo.find({}).sort({_id: 1}).limit(1).exec(function(err, photos) {
            if (err) {
                reject(err);
            }
            console.log('received: ', photos);
            resolve();
        }
    }
}

然后在路由器中应该具有:

getPhoto.next().then(function() {
    res.redirect('/');
});

这实际上是JS中Promises的基本用法。关于Promises用法的文章很多,您可以轻松找到它们,也可以转到mongoose官方页面,了解如何查询mongo并获取结果。