响应重复,但计数显示为1

时间:2019-01-08 10:31:50

标签: loops serverless-framework dynamoose

将Dynamoose ORM与无服务器一起使用。我有一种情况是根据推荐查找用户信息。

响应如下

{
    "data": {
        "results": [
            {
                "specialTip": "Hello World",
                "recommendation": "Huli ka!",
                "poi": {
                    "uuid": "poi_555",
                    "name": "Bukit Panjang",
                    "images": [
                        {
                            "url": "facebook.com",
                            "libraryUuid": "2222",
                            "uuid": "9999"
                        }
                    ]
                },
                "uuid": "i_8253578c-600d-4dfd-bd40-ce5b9bb89067",
                "headline": "Awesome",
                "dataset": "attractions",
                "insiderUUID": "i_c932e85b-0aee-4462-b930-962f555b64bd",
                "insiderInfo": [
                    {
                        "gender": "m",
                        "funFacts": [
                            {
                                "type": "knock knock!",
                                "answer": "Who's there?"
                            }
                        ],
                        "profileImage": "newImage.jpg",
                        "shortDescription": "Samething",
                        "fullDescription": "Whatever Description",
                        "interests": [
                            "HELLO",
                            "WORLD"
                        ],
                        "tribes": [
                            "HELLO",
                            "WORLD"
                        ],
                        "uuid": "i_c932e85b-0aee-4462-b930-962f555b64bd",
                        "personalities": [
                            "HELLO",
                            "WORLD"
                        ],
                        "travelledCities": [
                            "HELLO",
                            "WORLD"
                        ]
                    }
                ]
            },
            {
                "specialTip": "Hello World",
                "recommendation": "Huli ka!",
                "poi": {
                    "uuid": "poi_555",
                    "name": "Bukit Panjang",
                    "images": [
                        {
                            "url": "facebook.com",
                            "libraryUuid": "2222",
                            "uuid": "9999"
                        }
                    ]
                },
                "uuid": "i_8253578c-600d-4dfd-bd40-ce5b9bb89067",
                "headline": "Awesome",
                "dataset": "attractions",
                "insiderUUID": "i_c932e85b-0aee-4462-b930-962f555b64bd",
                "insiderInfo": [
                    {
                        "gender": "m",
                        "funFacts": [
                            {
                                "type": "knock knock!",
                                "answer": "Who's there?"
                            }
                        ],
                        "profileImage": "newImage.jpg",
                        "shortDescription": "Samething",
                        "fullDescription": "Whatever Description",
                        "interests": [
                            "HELLO",
                            "WORLD"
                        ],
                        "tribes": [
                            "HELLO",
                            "WORLD"
                        ],
                        "uuid": "i_c932e85b-0aee-4462-b930-962f555b64bd",
                        "personalities": [
                            "HELLO",
                            "WORLD"
                        ],
                        "travelledCities": [
                            "HELLO",
                            "WORLD"
                        ]
                    }
                ]
            }
        ],
        "count": 1
    },
    "statusCode": 200
}

不确定响应中的项目是否重复,但是计数 1

这是代码

module.exports.index = (_event, _context, callback) => {

  Recommendation.scan().exec((_err, recommendations) => {
    if (recommendations.count == 0) {
      return;
    }
    let results = [];
    recommendations.forEach((recommendation) => {
      Insider.query({uuid: recommendation.insiderUUID}).exec((_err, insider) => {
        if (insider.count == 0) {
          return;
        }
        recommendation.insiderInfo = insider;
        results.push(recommendation);
      });
    });
    const response = {
      data: {
        results: results,
        count: results.count
      },
      statusCode: 200
    };
    callback(null, response);
  });
};

1 个答案:

答案 0 :(得分:2)

编辑:我之前的代码忽略了“ Insider”查询是异步的事实。这段新代码可以处理并匹配您的编辑。

const async = require('async'); // install async with 'npm install --save async'
[...]
module.exports.index = (_event, _context, callback) => {

  Recommendation.scan().exec((_err, recommendations) => {
    if (_err) {
      console.log(_err);
      return callback(_err);
    }
    if (recommendations.count == 0) {
      const response = {
        data: {
          results: [],
          count: 0
        },
        statusCode: 200
      };
      return callback(null, response);
    }

    let results = [];
    async.each(recommendations, (recommendation, cb) => { // We need to handle each recommendation asynchronously...
      Insider.query({uuid: recommendation.insiderUUID}).exec((_err, insider) => { // because this is asynchronous
        if (_err) {
          console.log(_err);
          return callback(_err);
        }
        if (insider.count == 0) {
          return cb(null);
        }
        recommendation.insiderInfo = insider;
        results.push(recommendation);
        return cb(null);
      });
    }, (err) => { // Once all items are handled, this is called
      if (err) {
        console.log(err);
        return callback(err);
      }
      const response = { // We prepare our response
        data: {
          results: results, // Results may be in a different order than in the initial `recommendations` array
          count: results.count
        },
        statusCode: 200
      };
      callback(null, response); // We call our main callback only once
    });
  });
};

初始答案(部分不正确),以供参考。
您正在将映射结果推送到当前正在映射的对象中,callback在这里被多次调用。这是相当数量的意外行为材料。
请尝试以下操作:

let results = [];
recommendations.forEach((recommendation) => {
    Insider.query({uuid: recommendation.insiderUUID}).exec((_err, insider) => {
        if (insider.count == 0) {
          return;
        }
        recommendation.insiderInfo = insider;
        results.push(recommendation);
    });
});    
let response = {
  data: {
    results: results,
    count: results.count
  },
  statusCode: 200
};
callback(null, response);