首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在“`thinky`”模式验证中允许数组中的“未定义”值

在“`thinky`”模式验证中允许数组中的“未定义”值
EN

Stack Overflow用户
提问于 2015-12-30 12:56:16
回答 1查看 359关注 0票数 0

模式如下所示:

代码语言:javascript
复制
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

示例数据( YAML):

代码语言:javascript
复制
id: 1337
...
levels:
-
- rounds:
  - ...
    tries:
    - answer: [2, 4]
      ...

如果我将playerSchema.levels更改为type.array(),就会得到:

“数组undefined**"**中的元素不能是 levels

在评论后编辑:

即使在默认情况下这也不起作用..。

代码语言:javascript
复制
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)

结果..。

代码语言:javascript
复制
/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,但这没有任何影响

代码语言:javascript
复制
Player.pre('validate', function(next) {
  this.levels = this.levels.map(function(l) {
    return l != null ? l : {}
  })
  next()
})
EN

回答 1

Stack Overflow用户

发布于 2016-01-02 09:29:25

编辑跟进您的评论。这是您想要的(基本上需要数组模式定义中的默认值({}):

代码语言:javascript
复制
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);

“思考”一书的作者。这对我来说很管用:

代码语言:javascript
复制
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({}),因为您正在设置一个类型对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34529982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档