node.js - 使用模式方法在 Mongoose For 循环中保存项目

标签 node.js mongodb express mongoose instagram

如果我附加任何额外的验证方法,我在保存通过 for 循环运行的项目时会遇到问题。基本上,我正在构建一个允许编辑者删除不合时宜的照片的 instagram API 应用程序。照片以 20 张为一组从 Instagram 中提取并显示给编辑。如果编辑点击一张照片,它首先会按 ID 放入“黑名单”数据库,然后从主照片数据库中删除。

为了不让列入黑名单的照片再次出现在 Feed 上,在将项目保存到主照片数据库之前,需要根据黑名单检查照片的 Instagram ID。为此,我使用了架构方法。

现在的问题是,我只将一张照片保存到数据库中。如果我去掉方法检查,那么我得到所有 20 个。

这是我的主要创建 Controller :

exports.create = function(req, res) {

var topic = req.body.topic || 'nyc';

var path = 'https://api.instagram.com/v1/tags/' + topic + '/media/recent?client_id=' + 'XXXXXXXXXX';


request.get({url: path}, function(err, response){

  if (err){
    console.log('Failed to get data: ', err);
    return res.status(400).json({error: 'Not allowed'});
  }

  else{

    // ------------------------------------------------
    // Make sure we have JSON
    //

    var body = JSON.parse(response.body);



    // ------------------------------------------------
    // Loop through each response
    //

    for (var i = 0; i < body.data.length; i++ ){
      var photoData = body.data[i];


      // ------------------------------------------------
      // If there is no caption, skip it
      //

      if (!photoData.caption){
        text = '';
      }
      else{
        text = photoData.caption;
      }

      // ------------------------------------------------
      // Create new photo object
      //

      var photo = new Photo({
        link: photoData.link,
        username: photoData.user.username,
        profilePicture: photoData.user.profile_picture,
        imageThumbnail: photoData.images.thumbnail.url,
        imageFullsize: photoData.images.standard_resolution.url,
        caption: text,
        userId: photoData.user.id,
        date: photoData.created_time,
        _id: photoData.id
      });

      photo.checkBlacklist(function(err, blacklist){

        if (!blacklist){
          photo.save(function(err, item){
            if (err){
              console.log(err);
            }

            console.log('Saved', item);
          })
        }

      });

      // -------------------------------------------------
      //
      // Save
      // 
      // -------------------------------------------------

    } // END FOR LOOP

    console.log('Photos saved');
    return res.json(201, {msg: 'Photos updated'} );
  }
});
};

这是我的照片架构:

'use strict';

var mongoose = require('mongoose'),
Schema = mongoose.Schema;

var Blacklist = require('../blacklist/blacklist.model');

var PhotoSchema = new Schema({
  created: {type: Date, default: Date.now()},
  date: String,
  link: String,
  username: String,
  profilePicture: String,
  imageThumbnail: {type: String, unique: true},
  imageFullsize: String,
  caption: String,
  userId: String,
  _id: {type: String, unique: true}
});


PhotoSchema.methods.checkBlacklist = function(callback){

  return Blacklist.findById(this._id, callback);

};


module.exports = mongoose.model('Photo', PhotoSchema);

奇怪的是,我在创建 Controller 中收到了所有 20 次保存的控制台消息: console.log('已保存', item);

但实际只保存了一张照片。有什么想法吗?

谢谢

最佳答案

当您必须对数组中的项目执行相同的异步任务时,不要使用常规的 for 循环。查看async.each ,它更适合您的场景,例如(只是代码的 else 部分):

var body = JSON.parse(response.body);

async.each(body.data, function (photoData, callback) {

  // ------------------------------------------------
  // If there is no caption, skip it
  //

  if (!photoData.caption){
    text = '';
  }
  else{
    text = photoData.caption;
  }

  // ------------------------------------------------
  // Create new photo object
  //

  var photo = new Photo({
    link: photoData.link,
    username: photoData.user.username,
    profilePicture: photoData.user.profile_picture,
    imageThumbnail: photoData.images.thumbnail.url,
    imageFullsize: photoData.images.standard_resolution.url,
    caption: text,
    userId: photoData.user.id,
    date: photoData.created_time,
    _id: photoData.id
  });

  photo.checkBlacklist(function(err, blacklist){

    if (!blacklist){
      photo.save(function(err, item){
        if (err){
          console.log(err);
        }

        console.log('Saved', item);
        callback();
      });
    }

  });

}, function (error) {
  if (error) res.json(500, {error: error});

  console.log('Photos saved');
  return res.json(201, {msg: 'Photos updated'} );
});

不要忘记安装

npm install async

并要求异步:

var async = require('async');

关于node.js - 使用模式方法在 Mongoose For 循环中保存项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28478606/

相关文章:

javascript - 使用 Express 4 模块化 Socket.io

node.js - 找不到任何nodejs模块AWS Elastic Beanstalk

node.js - 如何在node.js、mongoose 中使用填充数据?

javascript - MONGO_URL 用于在一台服务器上运行多个 Meteor 应用程序

mongodb - 如何在 MongoDB 中的数组中更新和插入新元素

mongodb - 使用 FluentMongo 删除和更新文档

node.js - 检查node.js中的instanceof文件

node.js - 如何在 Ubuntu 服务器中使用 PM2 部署 express js

node.js - 如何使用nextJs显示自定义410页面

sql - sequelize 原始查询列不存在