如何在节点js上生成mongoose中的唯一键?

时间:2016-10-20 16:09:45

标签: node.js mongoose unique

流程是:

  1. 我生成currentKey(密钥由3个单词-分隔)
  2. 我检查我的收藏中是否有任何文件currentKey
  3. 如果不是 - currentKey将粘贴到我的收藏中的特定文档中。
  4. 但如果是 - currentKey将重新生成并重新开始。
  5. 问题是mongoose有异步回调,当查询完成执行时会运行。而且我不知道如何用这种异步流动来实现我的流程。作为示例(这只是为了方便起见的示例,它不是现有的框架等)我在php上做的就像下一个:

    $currentKey = someService.GenerateKey();
    //exists() returns true or false
    while($db->find('tablename', ['key' => $currentKey])->exists())
    {
        $currentKey = someService.GenerateKey();
    }
    //It's update 'tablename' where `id` equals to $someUserId and set `key` to $currentKey value
    $db->update('tablename', ['id' => $someUserId], ['key' => $currentKey]);
    

    你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

Promise就是为此而设计的。

function generateUniqueKey(modelId) {
  return new Promise((resolve, reject) => {
    currentKey = someService.GenerateKey();
    MyModel.count({ key: currentKey })
      .then(count => {
        if (count > 0) {
          generateUniqueKey(modelId);
        } else {
          MyModel.update({ id: modelId }, { $set: { key: currentKey } })
            .then(resolve(currentKey));
        }
      })
      .catch(err => reject(err));
  });
}

generateUniqueKey(someUserId).then(key => console.log('Generated unique key:', key));

但是如果你不关心结果,你可以删除Promise机制并让generateUniqueKey()方法自行结束。

function generateUniqueKey(modelId) {
  currentKey = someService.GenerateKey();
  MyModel.count({ key: currentKey })
    .then(count => {
      if (count > 0) {
        generateUniqueKey(modelId);
      } else {
        MyModel.update({ id: modelId }, { $set: { key: currentKey } })
          .then(() => console.log('Generated unique key:', currentKey))
          .catch(err => console.log(err));
      }
    })
    .catch(err => console.log(err));
}

generateUniqueKey(someUserId);