使用Sails-redis时失败,错误信息为`Details: AdapterError: 记录不满足唯一约束条件`
使用Sails框架时,有一天我从测试用的salis-disk切换到sails-redis,结果出现了快速错误,无法正常运行,因此我做个备忘。
触发条件
只要存在着至少一个create的目标模型实例,无论Model#create中的Object的id属性是undefined、null还是””,都会导致操作失败。
错误内容如下所示。
错误(E_UNKNOWN)::遇到了一个意外错误
适配器错误:记录不满足唯一约束条件
在~/sails-test/node_modules/sails-redis/lib/database/index.js的777行41列
在~/sails-test/node_modules/sails-redis/node_modules/redis/index.js的1170行13列
尝试回调(在~/sails-test/node_modules/sails-redis/node_modules/redis/index.js的592行9列)
RedisClient.return_reply(在~/sails-test/node_modules/sails-redis/node_modules/redis/index.js的685行13列)
在ReplyParser的321行14列
ReplyParser.EventEmitter.emit(events.js的95行17列)
ReplyParser.send_reply(在~/sails-test/node_modules/sails-redis/node_modules/redis/lib/parser/javascript.js的300行10列)
ReplyParser.execute(在~/sails-test/node_modules/sails-redis/node_modules/redis/lib/parser/javascript.js的211行22列)
RedisClient.on_data(在~/sails-test/node_modules/sails-redis/node_modules/redis/index.js的547行27列)
在Socket的102行14列
Socket.EventEmitter.emit(events.js的95行17列)
在stream_readable.js的746行14列
Socket.EventEmitter.emit(events.js的92行17列)
emitReadable(_stream_readable.js的408行10列)
emitReadable(_stream_readable.js的404行5列)
readableAddChunk(_stream_readable.js的165行9列)
Socket.Readable.push(_stream_readable.js的127行10列)
在TCP.onread(net.js的528行21列)详情:适配器错误:记录不满足唯一约束条件
逃避方法/规避计策
可以通过事先删除属性来避免。
var user = {id: "", title: "test"};
delete user.id
User.create(user).exec(console.log);
验证日志
最初发生原因不明,通过多种验证的结果得出。
通过在sails控制台启动并使用redis-cli的MONITOR命令来监视实际的查询。
# 最初のModel作成
sails> User.create({id: "", title:"hoge"}).exec(console.log)
undefined
sails> null { id: 1,
title: 'hoge',
createdAt: Wed Dec 31 2014 22:34:35 GMT+0900 (JST),
updatedAt: Wed Dec 31 2014 22:34:35 GMT+0900 (JST) }
# 2つ目のModel作成(id:""を設定。undefinedでも同様に発生)
sails> User.create({id: "", title:"hoge"}).exec(console.log)
undefined
sails> Error (E_UNKNOWN) :: Encountered an unexpected error
AdapterError: Record does not satisfy unique constraints
at ~/sails-test/node_modules/sails-redis/lib/database/index.js:777:41
at ~/sails-test/node_modules/sails-redis/node_modules/redis/index.js:1170:13
at try_callback (~/sails-test/node_modules/sails-redis/node_modules/redis/index.js:592:9)
at RedisClient.return_reply (~/sails-test/node_modules/sails-redis/node_modules/redis/index.js:685:13)
at ReplyParser.<anonymous> (~/sails-test/node_modules/sails-redis/node_modules/redis/index.js:321:14)
at ReplyParser.EventEmitter.emit (events.js:95:17)
at ReplyParser.send_reply (~/sails-test/node_modules/sails-redis/node_modules/redis/lib/parser/javascript.js:300:10)
at ReplyParser.execute (~/sails-test/node_modules/sails-redis/node_modules/redis/lib/parser/javascript.js:211:22)
at RedisClient.on_data (~/sails-test/node_modules/sails-redis/node_modules/redis/index.js:547:27)
at Socket.<anonymous> (~/sails-test/node_modules/sails-redis/node_modules/redis/index.js:102:14)
at Socket.EventEmitter.emit (events.js:95:17)
at Socket.<anonymous> (_stream_readable.js:746:14)
at Socket.EventEmitter.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:408:10)
at emitReadable (_stream_readable.js:404:5)
at readableAddChunk (_stream_readable.js:165:9)
at Socket.Readable.push (_stream_readable.js:127:10)
at TCP.onread (net.js:528:21)
Details: AdapterError: Record does not satisfy unique constraints
# id:""なしで実行
sails> User.create({title:"hoge"}).exec(console.log)
undefined
sails> null { title: 'hoge',
createdAt: Wed Dec 31 2014 22:37:29 GMT+0900 (JST),
updatedAt: Wed Dec 31 2014 22:37:29 GMT+0900 (JST),
id: 2 }
# User.create({id: "", title:"hoge"}).exec(console.log)
1420032875.597175 [0 127.0.0.1:60697] "MULTI"
1420032875.597206 [0 127.0.0.1:60697] "sismember" "waterline:user:_indicies:id" "NaN"
1420032875.597223 [0 127.0.0.1:60697] "EXEC"
1420032875.600085 [0 127.0.0.1:60697] "sismember" "waterline:user:_indicies:id" "NaN"
1420032875.600531 [0 127.0.0.1:60697] "sadd" "waterline:user:_indicies:id" "NaN"
1420032875.600971 [0 127.0.0.1:60697] "incr" "waterline:user:_sequences:id"
1420032875.601456 [0 127.0.0.1:60697] "set" "waterline:user:id:1" "{\"id\":1,\"title\":\"hoge\",\"createdAt\":\"2014-12-31T13:34:35.596Z\",\"updatedAt\":\"2014-12-31T13:34:35.596Z\"}"
1420032875.601777 [0 127.0.0.1:60697] "get" "waterline:user:id:1"
1420032875.605162 [0 127.0.0.1:60697] "sadd" "waterline:user:id" "waterline:user:id:1"
1420032875.605199 [0 127.0.0.1:60697] "sismember" "waterline:user:_indicies:id" "1"
1420032875.605963 [0 127.0.0.1:60697] "sadd" "waterline:user:_indicies:id" "1"
# User.create({id: "", title:"hoge"}).exec(console.log)
1420032949.726551 [0 127.0.0.1:60697] "MULTI"
1420032949.726584 [0 127.0.0.1:60697] "sismember" "waterline:user:_indicies:id" "NaN"
1420032949.726605 [0 127.0.0.1:60697] "EXEC"
# User.create({title:"hoge"}).exec(console.log)
1420033049.867159 [0 127.0.0.1:60697] "MULTI"
1420033049.867187 [0 127.0.0.1:60697] "EXEC"
1420033049.868439 [0 127.0.0.1:60697] "incr" "waterline:user:_sequences:id"
1420033049.869021 [0 127.0.0.1:60697] "set" "waterline:user:id:2" "{\"title\":\"hoge\",\"createdAt\":\"2014-12-31T13:37:29.866Z\",\"updatedAt\":\"2014-12-31T13:37:29.866Z\",\"id\":2}"
1420033049.869291 [0 127.0.0.1:60697] "get" "waterline:user:id:2"
1420033049.869765 [0 127.0.0.1:60697] "sadd" "waterline:user:id" "waterline:user:id:2"
1420033049.869793 [0 127.0.0.1:60697] "sismember" "waterline:user:_indicies:id" "2"
1420033049.870213 [0 127.0.0.1:60697] "sadd" "waterline:user:_indicies:id" "2"
笑林
顺便说一下,我在想是否有问题被注册了,于是试着在GitHub上搜索,结果居然成功找到了orz…。
虽然还没有关闭…。
- AdapterError: Record does not satisfy unique constraints