我正在创建一个摄影网站,最终我想添加让用户查看数据库中下一张照片的功能。我是 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,那么我该如何重写它呢?
最佳答案
您需要了解回调和 Promise。但对于你的答案,你可以像这样利用 mongoose 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 中 Promise 的基本用法。关于Promises的使用有很多文章,你可以很容易地找到它们,你可以去mongoose官方页面了解如何查询mongo并获取结果。
关于javascript - Mongoose 找到下一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53437378/