#reactjs #redux #pouchdb #rxdb
#reactjs #переопределение #pouchdb #rxdb
Вопрос:
Я пытаюсь реализовать простую стратегию миграции, как описано в документах здесь:https://rxdb.info/data-migration.html
Я хотел знать, успешно ли кто-нибудь внедрил migrationStrategies, поскольку я не могу найти никаких примеров в Интернете или я просто трачу свое время.
Когда я пытаюсь передать объект (как предписано в документах), я получаю следующую ошибку:
RxError: RxError: migrationStrategies должна быть неперехваченной функцией (в обещании) > RxError: RxError: migrationStrategy должна быть функцией
Когда я пытаюсь передать стратегии как функцию, я получаю следующую ошибку:
RxError: RxError: migrationStrategies должны быть объектной конструкцией.js:30 Неперехваченный (в обещании) RxError: RxError: migrationStrategies должен быть объектом
import * as RxDB from "rxdb"
import { Component } from "react"
import React from "react"
RxDB.plugin(require("pouchdb-adapter-idb"))
RxDB.plugin(require("pouchdb-adapter-http"))
const dbName = "master"
export default class App extends Component {
constructor(props) {
super(props)
this.state = {
newCookie: "",
cookies: [],
}
this.subs = []
this.addCookie = this.addCookie.bind(this)
this.handleCookieChange = this.handleCookieChange.bind(this)
}
async createDatabase() {
const db = await RxDB.create({
name: dbName,
adapter: "idb",
password: "12345678",
})
db.waitForLeadership().then(() => {
document.title = "â™› " document.title
})
await db.collection({
name: "cookies",
schema: {
title: "Cookie",
description: "Database schema for a cookie",
version: 6,
type: "object",
properties: {
id: {
type: "string",
primary: true,
},
flavour: {
type: "string",
},
someNewProperty: {
type: "string",
},
flavor: {
type: "string",
},
},
required: ["someNewProperty", "flavour"],
},
autoMigrate: true,
migrationStrategies: {
0: function(oldDoc) {
return oldDoc
},
// 1 means, this transforms data from version 0 to version 1
1: function(oldDoc) {
return oldDoc
},
2: function(oldDoc) {
return oldDoc
},
3: function(oldDoc) {
return oldDoc
},
4: function(oldDoc) {
return oldDoc
},
5: function(oldDoc) {
oldDoc.someNewProperty = oldDoc.flavor
oldDoc.flavour = oldDoc.someNewProperty
},
},
// 6: function(oldDoc) {
// oldDoc.someNewProperty = oldDoc.flavor
// return oldDoc
// },
// 7: function(oldDoc) {
// oldDoc.flavour = oldDoc.someNewProperty
// return oldDoc
// },
})
return db
}
async componentDidMount() {
this.db = await this.createDatabase()
debugger
const sub = this.db.cookies
.find()
.sort({ id: 1 })
.$.subscribe(cookies => {
if (!cookies) return
this.setState({ cookies: cookies })
})
this.subs.push(sub)
}
componentWillUnmount() {
this.subs.forEach(sub => sub.unsubscribe())
}
render() {
return (
<div className="App">
<div className="App-header">
<h2>Migration Strategies test</h2>
</div>
<div>{this.renderCookies()}</div>
<div id="add-message-div">
<h3>Add Cookie</h3>
<input
type="text"
placeholder="Cookie Flavor"
value={this.state.newCookie}
onChange={this.handleCookieChange}
/>
<button onClick={this.addCookie}>Add cookie</button>
</div>
</div>
)
}
renderCookies() {
console.log("test", this.state)
return this.state.cookies.map(
({ id, flavor, flavour, someNewProperty }) => {
return (
<div key={id}>
{/* <p>{date}</p> */}
<p>flavor: {flavor}</p>
<p>flavour:{flavour}</p>
<p>new prop: {someNewProperty}</p>
<hr />
</div>
)
}
)
}
handleCookieChange(event) {
this.setState({ newCookie: event.target.value })
}
async addCookie() {
const id = Date.now().toString()
const newCookie = { id, flavor: this.state.newCookie }
await this.db.cookies.insert(newCookie)
this.setState({ newCookie: "" })
}
}
ОЖИДАЕМЫЙ РЕЗУЛЬТАТ:
Выполняет миграции и устанавливает новые свойства (вкус и someNewProperty)
ФАКТИЧЕСКИЙ РЕЗУЛЬТАТ при передаче в migrationStrategies как object :
Error in console: RxError: RxError:
migrationStrategies must be a function
Uncaught (in promise) RxError: RxError:
migrationStrategy must be a function
Given parameters: {
version:5
type:"object"
schema:{
"jsonID": {
"title": "Cookie",
"description": "Database schema for a cookie",
"version": 6,
"type": "object",
"properties": {
"id": {
"type": "string",
"primary": true
},
"flavour": {
"type": "string"
},
"someNewProperty": {
"type": "string"
},
"flavor": {
"type": "string"
},
"_rev": {
"type": "string",
"minLength": 1
},
"_attachments": {
"type": "object"
}
},
"required": [
"someNewProperty",
"flavour",
"id"
],
"additionalProperties": false,
"keyCompression": false,
"compoundIndexes": []
},
"compoundIndexes": [],
"indexes": [],
"primaryPath": "id",
"finalFields": [
"id"
],
"_normalized": {
"additionalProperties": false,
"compoundIndexes": [],
"description": "Database schema for a cookie",
"keyCompression": false,
"properties": {
"_attachments": {
"type": "object"
},
"_rev": {
"minLength": 1,
"type": "string"
},
"flavor": {
"type": "string"
},
"flavour": {
"type": "string"
},
"id": {
"primary": true,
"type": "string"
},
"someNewProperty": {
"type": "string"
}
},
"required": [
"flavour",
"id",
"someNewProperty"
],
"title": "Cookie",
"type": "object",
"version": 6
},
"_hash": "2be159496392dec24c2a70e26094c600"
}}
migrationStrategies: () => {
return {
0: function(oldDoc) {
return oldDoc
},
// 1 means, this transforms data from version 0 to version 1
1: function(oldDoc) {
return oldDoc
},
2: function(oldDoc) {
return oldDoc
},
3: function(oldDoc) {
return oldDoc
},
4: function(oldDoc) {
return oldDoc
},
5: function(oldDoc) {
oldDoc.someNewProperty = oldDoc.flavor
oldDoc.flavour = oldDoc.someNewProperty
},
}
// 6: function(oldDoc) {
// oldDoc.someNewProperty = oldDoc.flavor
// return oldDoc
// },
// 7: function(oldDoc) {
// oldDoc.flavour = oldDoc.someNewProperty
// return oldDoc
// },
},
ФАКТИЧЕСКИЙ РЕЗУЛЬТАТ: При передаче стратегий миграции в виде функции, как указано выше, я получаю следующее сообщение об ошибке:
RxError: RxError: migrationStrategies must be an object
construct.js:30 Uncaught (in promise) RxError: RxError:
migrationStrategies must be an object
Given parameters: {
schema:{
"jsonID": {
"title": "Cookie",
"description": "Database schema for a cookie",
"version": 6,
"type": "object",
"properties": {
"id": {
"type": "string",
"primary": true
},
"flavour": {
"type": "string"
},
"someNewProperty": {
"type": "string"
},
"flavor": {
"type": "string"
},
"_rev": {
"type": "string",
"minLength": 1
},
"_attachments": {
"type": "object"
}
},
"required": [
"someNewProperty",
"flavour",
"id"
],
"additionalProperties": false,
"keyCompression": false,
"compoundIndexes": []
},
"compoundIndexes": [],
"indexes": [],
"primaryPath": "id",
"finalFields": [
"id"
],
"_normalized": {
"additionalProperties": false,
"compoundIndexes": [],
"description": "Database schema for a cookie",
"keyCompression": false,
"properties": {
"_attachments": {
"type": "object"
},
"_rev": {
"minLength": 1,
"type": "string"
},
"flavor": {
"type": "string"
},
"flavour": {
"type": "string"
},
"id": {
"primary": true,
"type": "string"
},
"someNewProperty": {
"type": "string"
}
},
"required": [
"flavour",
"id",
"someNewProperty"
],
"title": "Cookie",
"type": "object",
"version": 6
},
"_hash": "2be159496392dec24c2a70e26094c600"
}}
Комментарии:
1. Я думаю, что первая стратегия миграции с идентификатором 0 не имеет никакого смысла