在Array.map内部调用Mongoose: findOne方法时不完成/有奇怪的行为



因此,我有一个接收字符串数组的端点,并且我想用带有请求体参数的Mongoose搜索结果填充另一个数组。我在app.post("/whee", function (req, res)中的代码是这样的。

var SU = db.model("SignUp", supModel)
var dab = req.body.map(function(x) {
    return SU.findOne({"email": x}, function(err, data){
           if(err) throw err;
           return data;
           });
    });
console.log(dab);

如果我发送一个请求,当我将dab打印到控制台时,我得到的是:

[ { _mongooseOptions: {},
mongooseCollection: 
 { collection: [Object],
   opts: [Object],
   name: 'signups',
   conn: [Object],
   queue: [],
   buffer: false },
model: 
 { [Function: model]
   base: [Object],
   modelName: 'SignUp',
   model: [Function: model],
   db: [Object],
   discriminators: undefined,
   schema: [Object],
   options: undefined,
   collection: [Object] },
op: 'findOne',
options: {},
_conditions: { email: 'hello@sample.com' },
_fields: undefined,
_update: undefined,
_path: undefined,
_distinct: undefined,
_collection: { collection: [Object] },
_castError: null } ]

显然,hello@sample.com是我在请求中发送的数组的一个元素。为简单起见,可以假设该元素已经是我的mongo数据存储中的文档中的一个值。这是怎么呢为什么我收到的是这个乱码而不是我的文件?调用forEach方法并将结果推入dab只会呈现一个空数组,考虑到它是一个同步方法,这是有意义的。

关于如何解决这个问题有什么想法吗?

尝试使用async.

https://www.npmjs.org/package/async

var SU = db.model("SignUp", supModel);
var dab = [];
async.each(req.body, function(email, callback) {
  SU.findOne({"email": email}, function(err, data) {
    if (err) {
      callback(err);
    } else {
      dab.push(data);
      callback();
    }
  });    
}, function(err) {
  console.log(dab);
});

最新更新