首页 > 解决方案 > 在模型实例化时无法生成唯一的 UUIDv4

问题描述

我在尝试创建猫鼬模型实例时遇到了与 UUID 相关的问题。

猫鼬模式

export interface IRessourceModel extends IRessource, mongoose.Document { }

export let RessourceSchema: mongoose.Schema = new Schema({
    uuid: {
        type: String,
        default: uuidv4() },
    name: {
        type: String,
        required: true,
        minlength: RessourceValidation.CONSTANTS.NAME_MIN_LENGTH,
        maxlength: RessourceValidation.CONSTANTS.NAME_MAX_LENGTH,
        trim: true,
        validate: {
            validator: RessourceValidation.name,
            message: '{VALUE} is not a valid name'}},
    type: {
        type: String,
        required: true,
        enum: RessourceValidation.ENUM.TYPE,
        validate: {
            validator: RessourceValidation.type,
            message: '{VALUE} is not a valid type'}},
    uploaded: {
        type: Date,
        required: true,
        default: Date.now }
})

export const Ressource: mongoose.Model<IRessourceModel> = mongoose.model<IRessourceModel>('Ressource', RessourceSchema);

实例化

const RessourceModel = mongoose.model('Ressource');
// Some code here...

let Ressource: any = new RessourceModel({
    name: req.body.name,
    type: req.body.type,
})

Ressource.save((err, ressource) => {
    if (err)
        return (APIResponse.jsonErrorAfterMongooseQuery(res, 'Cannot create ressource', err));
    APIResponse.json(res, ressource);
})

问题

当我发送/ressources/使用上面的实例化代码的 POST 请求时,会创建资源,但是如果我发送另一个 POST 请求,则创建的第二个资源具有与第一个相同的 UUID ...

POST 请求 #1 的结果

{
    "type": true,
    "data": {
        "uuid": "1794bbb4-3385-4b0d-909a-e22c60aee608",
        "_id": "5b3a42f5ae71a02af4ed6d11",
        "name": "Name of ressource 1",
        "type": "IMAGE",
        "uploaded": "2018-07-02T15:21:25.866Z",
        "__v": 0
    }
}

POST 请求 #2 的结果

{
    "type": true,
    "data": {
        "uuid": "1794bbb4-3385-4b0d-909a-e22c60aee608",
        "_id": "5b3a4530f3ab1f3d40b7ac93",
        "name": "Name of ressource 2",
        "type": "IMAGE",
        "uploaded": "2018-07-02T15:30:56.379Z",
        "__v": 0
    }
}

我是用default: uuidv4()错了还是来自我实例化猫鼬模型的方式?还是别的什么?

我确实尝试过从Schema.pre('save')函数中设置 UUID 但没有成功......

我有点迷茫,谢谢你的帮助!

标签: node.jsuuidmongoose-schema

解决方案


这似乎uuidv4()是一个字符串。当然,所有型号都一样。

考虑到:

const uuidv4 = require('uuidv4');

Mongoosedefault模式选项可以接受一个函数来生成一个值:

export let RessourceSchema: mongoose.Schema = new Schema({
    uuid: {
        type: String,
        default: uuidv4
    },
    ...

推荐阅读