Sails的Model.findOrCreate在for循环中返回查询结果。

问题描述 投票:1回答:1

我从前台收到一个项目名称的数组。itemsNames. 我检查项目是否已经在DB中,还是应该创建新的记录。我写了下面的for-loop。我希望这个循环是 await 直到每个查询被执行,并将每个项目返回到一个列表中,以便以后再做一些处理。如果我去掉.exec()方法,查询返回的是创建或找到的项目。我如何才能将创建的项目暴露出来,并使for-loop等待到每个注册表被检查?我想拥有创建或已经存在的项目的注册表。在下面的示例截图中,所有的项目都是新的。

这个for-loop。

  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;

这是控制台的输出。

enter image description here

我使用的是Sails 1.2.4。

javascript for-loop asynchronous async-await sails.js
1个回答
1
投票

因为 findOrCreate 不接受数组作为参数,事实上,你需要循环浏览每个项目。最好的办法是使用 异步 模块。还提到 此处.

要安装async,运行 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被创建了.Response:

[
  {
    "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
  }
]
© www.soinside.com 2019 - 2024. All rights reserved.