【问题标题】:Sails' Model.findOrCreate to return the query result in a for loopSails 的 Model.findOrCreate 在 for 循环中返回查询结果
【发布时间】:2020-05-01 09:30:10
【问题描述】:

我从前端收到一组项目名称itemsNames。我检查这些项目是否已经在数据库中或是否应该创建新记录。我写了下面的for循环。我希望循环到await,直到每个查询都被执行,然后将每个项目返回到一个列表中,以便稍后进行更多处理。如果我删除 .exec() 方法,查询将返回创建或找到的项目。如何公开创建的项目并使 for 循环等待,直到检查每个注册表?我想拥有已创建或已存在项目的注册表。在以下示例屏幕截图中,所有项目都是新的。

for循环:

  let dbList;

  for (var i = 0; i < itemsNames.length; i++) {
    let itemsNames= itemsNames[i];
    dbList+= await Item.findOrCreate({ name: itemsNames}, { name: itemsNames})
    .exec( (err, item, wasCreated) => {
      if (err) {
        throw 'Unavailable';
      }
      if(wasCreated) {
        sails.log('Created a new Item: ' + item.name);
      } else {
        sails.log('Found the existing Item: ' + item.name);
      }
      return item;
    });
    console.log('returned from findOrCreate Items: ' + i + ' ' + dbList);
  }

  console.log('Loop end');

  return dbList;

这是控制台输出:

我使用的是 Sails 1.2.4

【问题讨论】:

    标签: javascript for-loop asynchronous async-await sails.js


    【解决方案1】:

    因为findOrCreate 不接受数组作为参数,您确实需要遍历每个项目。最好使用async 模块来完成。还提到了here

    要在项目根目录中安装异步运行npm i async --save。 然后您可以const async = require('async'); 或通过修改config/globals.js 将其添加为全局模块。在globals.js 中将async: false, 更改为async: require('async'),

    这是一个简单的async.map 代码,可以满足您的要求:

    async.map(
        items, // your items array [{"name": "foo"}, {"name": "bar"}, ...]
        (item, cb) => Item
            .findOrCreate(item, item)
            .exec((err, item, created) => cb(err, {item, created})),
        (err, data) => console.log(err || data) // data will contain array of data in {item: Item, created: true/false} format
    );
    

    如果您希望将此功能用于控制器操作,这里是一个示例:

    findOrCreateMultiple(req, res) {
        async.map(
            req.param('items'),
            (item, cb) => Item
                .findOrCreate(item, item)
                .exec((err, item, created) => cb(err, {item, created})),
            (err, data) => {
                if (err) return res.serverError(err);
                res.json(data);
            }
        );
    }
    

    你发送:

    {
        "items": [{"name": "foo"}, {"name": "bar"}, {"name": "biz"}]
    }
    

    foo 和 bar 已经存在,biz 已创建。 回应:

    [
      {
        "item": {
          "createdAt": 1589379855770,
          "updatedAt": 1589379855770,
          "id": 1,
          "name": "foo"
        },
        "created": false
      },
      {
        "item": {
          "createdAt": 1589379855774,
          "updatedAt": 1589379855774,
          "id": 2,
          "name": "bar"
        },
        "created": false
      },
      {
        "item": {
          "createdAt": 1589380146471,
          "updatedAt": 1589380146471,
          "id": 3,
          "name": "biz"
        },
        "created": true
      }
    ]
    

    【讨论】:

      猜你喜欢
      • 2017-10-07
      • 1970-01-01
      • 2015-07-23
      • 2010-11-06
      • 2021-10-16
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多