Как обновить вложенный документ во вложенном документе в firestore? - PullRequest
1 голос
/ 12 марта 2020

Вот моя функция

exports.updateUserSettings = functions.https.onRequest((request, response) => {
  cors(request, response, () => {
    setResponseHeaders(response);
    console.log('input', request.body);
    const name = request.body.name;
    const settings = request.body.settings;

     return db
      .collection(COLLECTION_USERS)
      .doc(name)
      .update(settings)
      .then(() => {
        return response.status(200).json({
          success: true,
          data: null
        });
      })
      .catch(error => {
        return response.status(200).json({
          success: false,
          error: error,
          data: null
        });
      });
  });
});

А вот мой документ пожарного магазина enter image description here

Я хочу обновить свой объект настроек. А вот мое тело запроса

 { name: 'frank6',
   settings: '{"autoPass":true,
   "autoRoll":true,
   "colors": {
     "check":"#000000", 
     "dark":"#b58863", 
     "light":"#f0d9b5", 
     "mate":"#ff4500", 
     "selected":"#90ee90", 
     "source":"#90ee90", 
     "target":"#228b22"
    }, 
   "language":"en",
   "showCheckMoves":true,
   "showFileRank":true,
   "showLastOpponentMove":true,
   "showMateMoves":true,
   "showMoves":true,
   "sounds":true,
   "view":"2D"
   }' 
 }

Имеется ошибка Ошибка: значение для аргумента «данные» не является допустимым документом Firestore. Ввод не является простым JavaScript объектом. Я знаю, как обновить вложенные документы на основе https://firebase.google.com/docs/firestore/manage-data/add-data#update_fields_in_nested_objects, но я не уверен, почему возникает эта ошибка, может быть, мне нужно отформатировать тело запроса, но теперь я уверен, как.

У меня также есть запрос от моего веб-приложения «Дрожание флаттера»

Future<void> updateUserSettings(ChexiUser user) async {
  await http.post(CLOUD_FUNCTIONS_BASE_URL + '/updateUserSettings', body: {
    'name': user.name,
    'settings': convert.jsonEncode(user.toSettingsFirebaseDocument())
  });
}

Вот моя функция toSettingsFirebaseDocument

Map<String, dynamic> toSettingsFirebaseDocument() {
  return {
    'autoPass': settingsAutoPass,
    'autoRoll': settingsAutoRoll,
    'colors': {
      'check': settingsColorsCheck,
      'dark': settingsColorsDark,
      'light': settingsColorsLight,
      'mate': settingsColorsMate,
      'selected': settingsColorsSelected,
      'source': settingsColorsSource,
      'target': settingsColorsTarget
    },
    'language': settingsLanguage,
    'showCheckMoves': settingsShowCheckMoves,
    'showFileRank': settingsShowFileRank,
    'showLastOpponentMove': settingsShowLastOpponentMove,
    'showMateMoves': settingsShowMateMoves,
    'showMoves': settingsShowMoves,
    'sounds': settingsSounds,
    'view': settingsView
  };
  }
 }

1 Ответ

3 голосов
/ 12 марта 2020

Хорошо, так получается, что это была простая ошибка. Мне просто нужно обернуть мой request.body с помощью JSON .parse ()

const settings = JSON.parse(request.body.settings);

И он работает правильно. Я не собираюсь удалять этот вопрос, возможно, он будет полезен для других, сталкивающихся с подобной проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...