Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rethinkdb 在'thinky'模式验证中允许数组中的'undefined'值_Rethinkdb_Rethinkdb Javascript_Thinky - Fatal编程技术网

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);