【问题标题】:mongoose find next object [duplicate]猫鼬找到下一个对象[重复]
【发布时间】:2019-04-25 12:23:56
【问题描述】:

我正在创建一个摄影网站,最终我想为用户添加功能以查看数据库中的下一张照片。我是 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)
    })
})

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

【问题讨论】:

  • 你不需要需要使用回调,你也可以使用从 Mongoose 返回的 Promise.... 但是如果你不熟悉其中任何一个这些概念我个人建议你从学习 Node 的基础知识开始。另外,mongoose docs中也有例子。
  • 不要相信您在找到的第一篇文章中看到的内容。从 2016 年开始,如果答案有任何可信度,那么它的投票数将大大超过 1。正如评论所说 “阅读文档 first。一旦您看到文档中的内容,您就可以提出问题并阅读其他人的答案。它说Photo.find({}).sort({ _id: 1 }).limit(1).then( docs => console.log(docs[0]._id) )。与现在链接的更规范和投票率更高的答案的另一个要点一样。
  • 或者Photo.findOne({}).sort({ _id: 1 }).then( doc => console.log(doc) )

标签: javascript node.js mongoose


【解决方案1】:

您需要了解回调和承诺。但是对于您的答案,您可以像这样利用猫鼬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并得到结果。

【讨论】:

  • 从上面的评论 "你也可以利用从 Mongoose 返回的 Promise.." - 和when you look,你会看到 API 允许 Promise无需自己包装在 Promise 中即可返回。因此,您回答前 4 小时的评论对您来说也是有效的。
猜你喜欢
  • 2019-10-12
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 2017-04-27
  • 2013-01-13
  • 1970-01-01
相关资源
最近更新 更多