Разрешение "неопределенных" значений в массиве при проверке схемы "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(),
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([])
}
Когда я пытаюсь сохранить игрока, где уровни undefined
значения, которые я получаю:
"Невозможно прочитать свойство раундов undefined
"
Дальнейшее объяснение: Иногда игрок входит в игру после того, как другие игроки завершили первый уровень. Итак, я хотел бы, чтобы значение этого индекса в массиве оставалось undefined
,
id: 1337
...
levels:
-
- rounds:
- ...
tries:
- answer: [2, 4]
...
Если я изменюсь playerSchema.levels
в type.array()
, Я получил:
"Элемент в массиве [уровни] (позиция 0) не может быть undefined
"
Редактировать после комментариев:
Даже с настройками по умолчанию это не работает...
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
Я даже пытался создать pre validation hook
, но это никак не влияет на то, что когда-либо...
Player.pre('validate', function(next) {
this.levels = this.levels.map(function(l) {
return l != null ? l : {}
})
next()
})
1 ответ
Редактировать после вашего комментария. Это то, что вы хотите (вам в основном нужно по умолчанию ({}) внутри определения схемы массива:
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({})
так как вы устанавливаете тип объекта.