首页 > 解决方案 > UUID作为sailsjs域中的主键

问题描述

我正在使用 Sails.js 版本 1.0.2。我正在尝试将 uuid 分配为整个应用程序的主键。我尝试放入
id: { type: 'string', defaultsTo:uuid.v4() }model.js 但它说主键必须是唯一的,因此不能包含默认值。

_________________编辑_______________

我在我的域中尝试了此代码

beforeCreate: function (modelObj, next) {
modelObj.id = uuidv4.v4();
next();
}

并编辑我的 Model.js 配置,如下所示:

attributes: {
createdAt: { type: 'number', autoCreatedAt: true, },
updatedAt: { type: 'number', autoUpdatedAt: true, },
id: { type: 'string',required:true},
}

beforeCreate 方法在创建记录时永远不会执行并抛出错误,例如:

error: Sending 500 ("Server Error") response: 
{ UsageError: Invalid new record.
Details:
Missing value for required attribute `id`.  Expected a string, but 
instead, got: undefined

如果我做错了什么,请告诉我。

谢谢

标签: sails.js

解决方案


你可以做这样的事情而不是给出默认值

beforeCreate: function (modelObj, next) {
    modelObj.id = uuid.v4();
    next();
  }

您可以在模型中添加此功能。只要模型上有创建操作,就会调用它。

您的Model.js应该看起来像这样

attributes: {
    createdAt: { type: 'number', autoCreatedAt: true, },
    updatedAt: { type: 'number', autoUpdatedAt: true, },
    id: { type: 'string',required:true},
},
beforeCreate: function (modelObj, next) {
    modelObj.id = uuid.v4();
    next();
}

我的控制器和模型的示例代码,

测试控制器.js

module.exports = {
    create: function(req, res) {
        Test.create({"name": "arshad"})
            .then(function(result){
                res.send("done");
            })
    }
};

Test.js模型

module.exports = {

  attributes: {
     id: { type: 'string', required: true },
     name: { type: 'string' }
  },
  beforeCreate: function(obj, next) {
     obj.id = 'someId';
     next();
  }
};

这就是您的模型和控制器的外观。这会将在beforeCreate函数中定义的 someId 添加到对象

在您的情况下,您使用的是 uuid 包。在调试模式下检查 beforeCreate 中是否有 uuid 引用


推荐阅读