Rethinkdb 在'thinky'模式验证中允许数组中的'undefined'值
架构如下所示:Rethinkdb 在'thinky'模式验证中允许数组中的'undefined'值,rethinkdb,rethinkdb-javascript,thinky,Rethinkdb,Rethinkdb Javascript,Thinky,架构如下所示: import Game from './Game' import {io, thinky} from '../' const type = thinky.type export const playerSchema = { id: type.string(), createdAt: type.date().default(thinky.r.now()), modifiedAt: type.date(), gameId: type.string(), na
import Game from './Game'
import {io, thinky} from '../'
const type = thinky.type
export const playerSchema = {
id: type.string(),
createdAt: type.date().default(thinky.r.now()),
modifiedAt: type.date(),
gameId: type.string(),
name: type.string().default('Anon'),
socket: type.string(),
disconnected: type.boolean().default(false),
levels: type.array().schema(type.object().schema({
rounds: type.array().schema({
card: type.number(),
readyForNext: type.boolean().default(false),
readyForNextTime: type.date(),
tries: type.array().schema({
answer: type.any(),
correct: type.boolean(),
startTime: type.date(),
hasAnswered: type.boolean().default(false),
hasAnsweredTime: type.date().default(null),
hasClickedRetry: type.boolean().default(false),
hasClickedRetryTime: type.date()
}).default([])
}).default([])
})).default([])
}
当我试图保存一个级别有未定义值的玩家时,我得到:
无法读取未定义的的属性“轮数”
“
进一步解释:有时一名玩家会在其他玩家完成第一关后进入游戏。因此,我希望数组中该索引的值保持未定义
示例数据(以YAML为单位):
如果我将playerSchema.levels
更改为type.array()
,我会得到:
“数组[级别](位置0)中的元素不能是未定义的”
“
评论后编辑:
即使使用默认设置,这也不起作用
var thinky = require('thinky')({
db: 'slam'
})
var type = thinky.type
var r = thinky.r
var playerSchema = {
id: type.string(),
createdAt: type.date().default(thinky.r.now()),
modifiedAt: type.date(),
gameId: type.string(),
name: type.string().default('Anon'),
socket: type.string(),
disconnected: type.boolean().default(false),
levels: type.array().schema(type.object().schema({
rounds: type.array().schema(type.object().schema({
card: type.number(),
readyForNext: type.boolean().default(false),
readyForNextTime: type.date(),
tries: type.array().schema(type.object().schema({
answer: type.any(),
correct: type.boolean(),
startTime: type.date(),
hasAnswered: type.boolean().default(false),
hasAnsweredTime: type.date().default(null),
hasClickedRetry: type.boolean().default(false),
hasClickedRetryTime: type.date()
}).default({})).default([])
}).default({})).default([])
}).default({})).default([])
}
var Player = thinky.createModel('Player', playerSchema)
var player = new Player({
levels: [undefined, {}]
})
player.save().then(console.log)
结果
/Users/arnar/git/slam-web-app/app/node_modules/thinky/lib/schema.js:92
field = field[path[j]];
^
TypeError: Cannot read property 'rounds' of undefined
at generateDefault (/Users/arnar/git/slam-web-app/app/node_modules/thinky/lib/schema.js:92:20)
at Object.generateDefault (/Users/arnar/git/slam-web-app/app/node_modules/thinky/lib/schema.js:86:11)
at model.Document._generateDefault (/Users/arnar/git/slam-web-app/app/node_modules/thinky/lib/document.js:172:16)
at new model (/Users/arnar/git/slam-web-app/app/node_modules/thinky/lib/model.js:131:11)
at Object.<anonymous> (/Users/arnar/git/slam-web-app/app/tests/test-player-schema.js:36:14)
at Module._compile (module.js:434:26)
at Object.Module._extensions..js (module.js:452:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Function.Module.runMain (module.js:475:10)
at startup (node.js:117:18)
at node.js:951:3
编辑并跟进您的评论。
这就是您想要的(您基本上需要数组模式定义中的默认({}):
var thinky = require('./lib/thinky.js')();
var type = thinky.type;
var r = thinky.r;
var Player = thinky.createModel('Player', {
id: type.string(),
levels: type.array().schema(type.object().schema({
rounds: type.array().schema(type.object({
card: type.number(),
readyForNext: type.boolean().default(false),
readyForNextTime: type.date(),
tries: type.array().schema({
answer: type.any(),
correct: type.boolean(),
startTime: type.date(),
hasAnswered: type.boolean().default(false),
hasAnsweredTime: type.date().default(null),
hasClickedRetry: type.boolean().default(false),
hasClickedRetryTime: type.date()
}).default({})
}).default({})).default([])
})).default([])
})
var player = new Player({
levels: [{}]
});
player.save().then(console.log);
thinky的作者。这对我来说很有用:
var thinky = require('./lib/thinky.js')();
var type = thinky.type;
var r = thinky.r;
var Player = thinky.createModel('Player', {
id: type.string(),
levels: type.array().schema(type.object().schema({
rounds: type.array().schema({
card: type.number(),
readyForNext: type.boolean().default(false),
readyForNextTime: type.date(),
tries: type.array().schema({
answer: type.any(),
correct: type.boolean(),
startTime: type.date(),
hasAnswered: type.boolean().default(false),
hasAnsweredTime: type.date().default(null),
hasClickedRetry: type.boolean().default(false),
hasClickedRetryTime: type.date()
}).default([])
}).default({})
})).default([])
})
var player = new Player({
levels: undefined
});
player.save().then(console.log);
另一方面,您可能希望将一个default([])
替换为default({})
因为您正在设置一个类型对象。我对Thinky不太了解,但是如果未定义的值不起作用,您可以尝试重新编写代码,改为使用null
。levels
应该是一个数组。levels=undefined
可以正常工作,但levels=[undefined,{..]
不起作用。只是编辑了我的答案。您缺少使级别:[undefined,{}]
起作用的默认值。但我不希望{}
成为默认值,我希望它保持undefined
。另外,我认为您的观点是错误的。您正在将轮数的默认值设置为{}
而它应该是[]
。我对数组中的对象没有默认设置,因为它们应该是未定义的
。在这种情况下,它非常简单。你不能保存未定义的
,因为它不是JSON值。是的,但我也不能保存null
。我对预验证挂钩有什么错吗?
var thinky = require('./lib/thinky.js')();
var type = thinky.type;
var r = thinky.r;
var Player = thinky.createModel('Player', {
id: type.string(),
levels: type.array().schema(type.object().schema({
rounds: type.array().schema(type.object({
card: type.number(),
readyForNext: type.boolean().default(false),
readyForNextTime: type.date(),
tries: type.array().schema({
answer: type.any(),
correct: type.boolean(),
startTime: type.date(),
hasAnswered: type.boolean().default(false),
hasAnsweredTime: type.date().default(null),
hasClickedRetry: type.boolean().default(false),
hasClickedRetryTime: type.date()
}).default({})
}).default({})).default([])
})).default([])
})
var player = new Player({
levels: [{}]
});
player.save().then(console.log);
var thinky = require('./lib/thinky.js')();
var type = thinky.type;
var r = thinky.r;
var Player = thinky.createModel('Player', {
id: type.string(),
levels: type.array().schema(type.object().schema({
rounds: type.array().schema({
card: type.number(),
readyForNext: type.boolean().default(false),
readyForNextTime: type.date(),
tries: type.array().schema({
answer: type.any(),
correct: type.boolean(),
startTime: type.date(),
hasAnswered: type.boolean().default(false),
hasAnsweredTime: type.date().default(null),
hasClickedRetry: type.boolean().default(false),
hasClickedRetryTime: type.date()
}).default([])
}).default({})
})).default([])
})
var player = new Player({
levels: undefined
});
player.save().then(console.log);