Sequelize найти или создать для списка элементов - PullRequest
0 голосов
/ 30 апреля 2020

Я новичок в секвелировании и не очень много смотрел, но не нашел ничего конкретного. c

// API Method
function SeederApi(req: Request, res: Response) {
  let request = req.body;
  let _model_methods = new ModelMethod();
  request.forEach((obj: any) => {
    const condition = { name: obj.username };
    const value = {
      name: obj.username ,
      short_text: obj.short_txt
    };
    _model_methods.findorCreate(condition, value)
      .then((resp: any) => {
        const _response = resp.get({ plain: true });
        console.log(_response);
      });
  });
    return res.status(200).send("Created");
}
export class ModelMethod{

  init(){}

  findorCreate = (condition: any, value: any) => {
    return Model
      .findOne({ where: condition })
      .then((obj : any) => {
        if(obj){ return obj }
        return RiskFactors.create(value);
      })
  }
}

Проблема здесь в том, что 2 или более записей с одинаковым именем пользователя находятся в список, он должен возвращать объект, а не создавать его. Это прекрасно работает, если в запросе только один элемент. Но когда у меня есть несколько предметов с возможно одним и тем же именем пользователя. В итоге создаются повторяющиеся записи, поскольку запрос sequelize асин c, а мой l oop - нет.

Я понимаю проблему здесь, я не знаю, чтобы справиться с этим.

Спасибо за помощь заранее.

1 Ответ

0 голосов
/ 30 апреля 2020

не используйте forEach с асинхронными c вызовами в своих итерациях. Используйте обычный для:

for (const obj:any of request) {
  const condition = { name: obj.username };
  const value = {
    name: obj.username ,
    short_text: obj.short_txt
  };
  const resp = await _model_methods.findorCreate(condition, value);
  const _response = resp.get({ plain: true });
  console.log(_response);
}

...