Javascript 帆';Model.findOrCreate以在for循环中返回查询结果

Javascript 帆';Model.findOrCreate以在for循环中返回查询结果,javascript,for-loop,asynchronous,async-await,sails.js,Javascript,For Loop,Asynchronous,Async Await,Sails.js,我从前端收到一个项目名称数组itemsNames。我检查项目是否已经在数据库中,或者是否应该创建新记录。我为循环编写了以下代码。我希望循环等待,直到执行每个查询,然后将每个项返回到列表中,以便以后执行更多的过程。如果删除.exec()方法,查询将返回已创建或找到的项。如何公开创建的项并使for循环等待,直到选中每个注册表?我想拥有已创建或已存在项目的注册表。在下面的示例屏幕截图中,所有项目都是新的 for循环: let dbList; for (var i = 0; i < it

我从前端收到一个项目名称数组
itemsNames
。我检查项目是否已经在数据库中,或者是否应该创建新记录。我为循环编写了以下代码。我希望循环等待,直到执行每个查询,然后将每个项返回到列表中,以便以后执行更多的过程。如果删除.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;
let-dbList;
对于(变量i=0;i{
如果(错误){
抛出“不可用”;
}
如果(已创建){
sails.log('创建了一个新项目:'+项目名称);
}否则{
sails.log('找到现有项:'+项.name);
}
退货项目;
});
log('从findOrCreate项返回:'+i+'+dbList);
}
log('Loop end');
返回数据库列表;
这是控制台输出:


我使用的是Sails 1.2.4

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

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

下面是一个简单的代码,可以实现您想要的功能:

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
  }
]