如何定义和使用 UUID 字段?

How can I define and use a UUID field?

我需要一个内容类型中的UUID字段,借助下面的介绍我已经修改了文件"MyType.settings.json"。

https://strapi.io/documentation/3.x.x/guides/models.html#define-the-attributes

"uid": {
  "default": "",
  "type": "uuid"
},

我以为自动保存了一个UUID,但是没有任何反应。

如何定义和使用 UUID 字段?有人可以给我提示吗? 我是否也应该修改文件 \api\MyType\controllers\MyType.js?

提前致谢!

本杰明

您将不得不使用 uuid 节点模块。 所以保留你的属性并在 lifeCyle 函数中,用 lib.

设置你的 uuid
'use strict';

const uuid = require('uuid');

module.exports = {
  beforeCreate: async (model) => {
    model.set('uid', uuid());
  }
};

您可能还需要一个 v4 UUID,它的生成速度最快 非常 很大余量,并且在所有其他条件相同的情况下,您发生冲突的机会最少(可以是 10 倍甚至更快),这是 99% 的人想要生成 UUID 的原因:

Work in the global UUID community, remain as unique as possible, not collide with anything else.

此外,v4 比 v1 更安全,因为 v1 包括它的制作时间和它是在哪个硬件上创建的,并且具有 疯狂 更高的冲突率,因为今天没有人尊重节点字段并用熵填充它,这破坏了 v1 的全部目的。

使用 v4 而不是 v1 的原因如此明显,以至于应该 public 和广泛传播这些信息。这是白天和黑夜。所有只寻求熵的主要框架现在都使用 v4.

import { v4 as uuid } from "uuid";
// Then just...
const myUUID = uuid()

UUID v1 的创建是因为人们,即使是想出 UUID 的天才计算机科学家,也没有完全理解单独的 128 位地址 space 比花哨的计时和节点跟踪要好得多。 UUID v1 是过度工程的一个很好的例子。

为了在通过 API 和管理 UI 保存实体后自动生成 uuid,请使用模型的 lifecycle 方法,而不是控制器。因此,文件 /api/myType/models/myType.js 可能如下所示:

'use strict';

const { v4: uuid } = require('uuid');

module.exports = {
  lifecycles: {
    beforeCreate: async (data) => {
      if (!data.uuid) {
        data.uuid = uuid();
      }
    },
  }
};