Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"Local schema mismatch from server" - when defining multiple rooms/states #131

Open
endel opened this issue Dec 1, 2020 · 5 comments
Open

Comments

@endel
Copy link
Member

endel commented Dec 1, 2020

This error is reported often, and one of its causes is when multiple room/state classes are defined in the server with the same schema "context".

Internally, every @type() call is going to register the property in a "global" context:

import { type, Schema } from "@colyseus/schema";

class State1 extends Schema {
  @type(...) my_prop
}

class State2 extends Schema {
  @type(...) my_prop
}

To avoid registering every schema in the global context, you can create a different context like this:

import { Context, Schema } from "@colyseus/schema"; // do not import "type" here

const type = Context.create(); // this is your @type() decorator bound to a context

class State2 extends Schema {
  @type(...) my_prop
}

Actions needed:

  • Update documentation to encourage creating different contexts, especially in Unity because of the crash
  • Throw WARNING on the client-side instead of ERROR when handshake sends more structures than necessary
@sorrow31812
Copy link

sorrow31812 commented Dec 16, 2020

Hi @endel, I also got this error, but i am using javascript instead of typescript on the server side.
Can u give a javascript example?
Thanks a lot.

@endel
Copy link
Member Author

endel commented Dec 16, 2020

Hi @sorrow31812, for plain JavaScript it is a bit complicated, the general suggestion is to always use TypeScript:

// javascript
const schema = require("@colyseus/schema");

// create a new context
const context = new schema.Context();

class MyState extends schema.Schema {
}
schema.defineTypes(MyState, {
  currentTurn: "string"
}, context); // use the context

Make sure you use the specified context for every structure your state depends on, otherwise the "schema mismatch" is going to happen

@sorrow31812
Copy link

I get it, thanks for your help! 👍

@endel endel pinned this issue Mar 19, 2021
@endel
Copy link
Member Author

endel commented Apr 6, 2021

Another known appearance of the "schema-mismatch" problem was just found by @drburton when duplicating a field name through inheritance. Just documenting this here, as a fix is coming soon!

How to reproduce

class Entity extends Schema {
    @type("string") id: string;
    @type("string") ownerId: string;
    @type("number") xPos: number = 0;
    @type("number") yPos: number = 0;
    @type("number") zPos: number = 0;
}

class Player extends Entity {
    @type("string") id: string; // duplicate "id" from Entity - "schema-mismatch" is going to happen!
    @type("boolean") connected: boolean;
}

EDIT: since @colyseus/schema@1.0.20 the above definition is going to throw an error pointing out where the duplicate definition is located at. (colyseus/schema@a8b86e9)

@hdev72
Copy link

hdev72 commented Jun 21, 2022

hello dear friends
i have this error only in android build of unity (apk), in editor when i running game every thing is ok

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants