首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >es6猫鼬巢式findById承诺

es6猫鼬巢式findById承诺
EN

Stack Overflow用户
提问于 2017-05-14 22:56:15
回答 1查看 539关注 0票数 1

我正在构建一个restful,使用节点、表示、猫鼬/mongo等等。我试图输出一个用户数组,然后是一个特定的用户。这是模式。

代码语言:javascript
复制
var UserSchema = new mongoose.Schema({
  username: {type: String, lowercase: true, unique: true, required: [true, "can't be blank"], match: [/^[a-zA-Z0-9]+$/, 'is invalid'], index: true},
  email: {type: String, lowercase: true, unique: true, required: [true, "can't be blank"], match: [/\S+@\S+\.\S+/, 'is invalid'], index: true},
  bio: String,
  image: String,
  following: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }]
}, {timestamps: true});

因此,每个用户在一个数组中都有一个用户数组,其中键为“下面”。我试图输出这个列表,首先通过它自己的id找到用户记录,然后通过这个数组进行映射,以找到这个当前用户的后续用户。

代码语言:javascript
复制
router.get('/users/friends', auth.required, function(req, res, next) {
  var limit = 20;
  var offset = 0;

  if(typeof req.query.limit !== 'undefined'){
    limit = req.query.limit;
  }

  if(typeof req.query.offset !== 'undefined'){
    offset = req.query.offset;
  }

  User.findById(req.payload.id)
  .then(function(user){
    if (!user) { return res.sendStatus(401); }

    return res.json({
      users: user.following.map(function(username){
        User.findById(username)
          .then(function(userlist){
            console.log('userlist:',userlist.username);
            return userlist.username;
          })
          .catch(next)
      })
    })
  })
  .catch(next);
});

现在,这段代码中的console.log在js控制台中输出正确的数据,但是我似乎找不到一种方法将这些数据传递给客户机。到目前为止,我的努力在客户机中产生了'null‘值。正确的记录量,但仅为空值。有什么办法解决这个问题吗?

在听取了下面的建议后,修改了我的代码。现在,它设法将第一条记录传递给客户端,但是在

UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝id: 1):错误:无法在发送后设置标头。区块报价

代码语言:javascript
复制
router.get('/users/friends', auth.required, function(req, res, next) {
    var limit = 20;
    var offset = 0;

    if (typeof req.query.limit !== 'undefined') {
        limit = req.query.limit;
    }

    if (typeof req.query.offset !== 'undefined') {
        offset = req.query.offset;
    }


    User.findById(req.payload.id)

        .then(function(user) {
            if (!user) {
                return res.sendStatus(401);
            }
            Promise.all(
                user.following
            ).then(function(userarray) {
              console.log(userarray);
                userarray.forEach(function(userid) {
                     Promise.all([
                        User.find({
                            _id: {
                                $in: userid
                            }
                        })
                        .limit(Number(limit))
                        .skip(Number(offset))
                        .populate('author')
                        .exec()
                    ]).then(function(results) {
                        userdetails = results[0];
                        var userdetailsCount = results[1];

                        return res.json({
                          userdetails: userdetails.map(function(userdetail){
                            return userdetail;
                          })
                        });
                    })
                })
            })
        })
        .catch(next);
});
EN

回答 1

Stack Overflow用户

发布于 2017-05-14 23:17:49

你的问题部分是:

代码语言:javascript
复制
return res.json({
  users: user.following.map(function(username){
    User.findById(username)
      .then(function(userlist){
        console.log('userlist:',userlist.username);
        return userlist.username;
      })
      .catch(next)
  })
})

User.findById(username)将返回一个承诺。但你不是在等待那个承诺。我猜您认为遵循该承诺的then函数(将userlist.username记录到控制台并返回它)应该意味着您的map函数返回userlist.username的列表。但情况并非如此。您的map函数正在返回一系列承诺。

您真正想要的是像Bluebird的Promise.maphttp://bluebirdjs.com/docs/api/promise.map.html这样的特性(或者,寻找类似的特性,在您碰巧使用的承诺库中处理承诺数组)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43969555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档