Dart json.encode 没有按照 Firebase 函数的需要进行编码 [英] Dart json.encode is not encoding as needed by Firebase Function

查看:15
本文介绍了Dart json.encode 没有按照 Firebase 函数的需要进行编码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在研究这个问题一段时间,但我似乎无法弄清楚究竟是什么问题.在 Dart(2) 中, json.encode() 似乎没有给我我想要的结果.

I've been working on this issue for some time now, and I can't seem to figure out what exactly the issue is. In Dart(2) the json.encode() does not seem to be giving me the result I am aiming for.

我正在传递一个 Map<String, dynamic>,如下所示:

I am passing in a Map<String, dynamic> that looks like this:

_data = <String, dynamic>{
    'uid': newProfileCreationModel.accountID,
    'displayName': newProfileCreationModel.profileName,
    'greeting': newProfileCreationModel.profileBody ?? '',
    'avatarSrc': newProfileCreationModel.avatarSrc,
    'heroSrc': newProfileCreationModel.heroSrc,
    'accountType': newProfileCreationModel.accountType,
    'cityID': newProfileCreationModel.cityID,
    'cityName': newProfileCreationModel.cityName,
    'country': newProfileCreationModel.countryCode,
    'state': newProfileCreationModel.stateAbv,
  };

并使用它来将其转换为 JSON

and using this to convert it to JSON

final String _jsonData = json.encode(_data);

然后我通过以下方式将其发送到谷歌云功能.

Then I am sending it to a google cloud function in the following way.

final Uri _uri = Uri.parse(functionUrl);
final String _jsonData = json.encode(_data);
final String _userToken = await AuthenticationService.getUserToken();

HttpClient client = new HttpClient();
HttpClientRequest request = await client.postUrl(_uri);
request.headers.set('Authorization', 'Bearer ' + _userToken);
request.headers.set('Content-Type', 'application/json; charset=utf-8');
print('Encoded: ' + _jsonData);
request.write(_jsonData);

HttpClientResponse response = await request.close();
if(response.statusCode != HttpStatus.OK){ ...

我打印编码字符串的那一行输出到控制台:

The line where I print the encoded string outputs this to the console:

05-04 18:52:57.902 26146-26200/com.app.name I/flutter: Encoded: {"uid":'123456789',"displayName":"James","greeting":"My Greetings!","avatarSrc":"http://cdn.free.com/someImage.jpg","heroSrc":"http://cdn.free.com/someImage.jpg","accountType":"per","cityID":1,"cityName":"Eugene","country":"US","state":"OR"}

但是 request.write(_jsonData) 失败并出现以下 firebase 控制台日志错误 Request Body Missing Data

However the request.write(_jsonData) fails with the following firebase console log error Request Body Missing Data the response that looks like this in the

Firebase 控制台日志.

Request body is missing data.  { 
    uid: '123456789',
    displayName: 'James',
    greeting: 'My Greetings!',
    avatarSrc: 'http://cdn.free.com/someImage.jpg',
    heroSrc: 'http://cdn.free.com/someImage.jpg',   accountType: 'per',   
    cityID: 1,
    cityName: 'Eugene',   
    country: 'US',
    state: 'OR' 
}


Invalid request IncomingMessage {
  _readableState: 
   ReadableState {
     objectMode: false,
     highWaterMark: 16384,
     buffer: BufferList { head: null, tail: null, length: 0 },
     length: 0,
     pipes: null,
     pipesCount: 0,
     flowing: true,
     ended: true,
     endEmitted: true,
     reading: false,
     sync: false,
     needReadable: false,
     emittedReadable: false,
     readableListening: false,
     resumeScheduled: false,
     defaultEncoding: 'utf8',
     ranOut: false,
     awaitDrain: 0,
     readingMore: false,
     decoder: null,
     encoding: null },
  readable: false,
  domain: null,
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined,
  socket: 
   Socket {
     connecting: false,
     _hadError: false,
     _handle: 
      TCP {
        bytesRead: 13285,
        _externalStream: {},
        fd: 14,
        reading: true,
        owner: [Circular],
        onread: [Function: onread],
        onconnection: null,
        writeQueueSize: 0,
        _consumed: true },
     _parent: null,
     _host: null,

有趣的部分是数据正在通过,在 firebase 控制台日志中清楚地显示,但它不会将其识别为主体.

The interesting part is that the data is getting through as is clearly displayed in the firebase console log, however it won't recognize it as the body.

原始数据方法

当我尝试通过 request.write() 作为

When I try sending a raw JSON object through the request.write() as

request.write({'hello':'universe'});

我在 Firebase 控制台中遇到了一种完全不同的错误.

I get a totally different kind of error in the firebase console.

SyntaxError: Unexpected token h in JSON at position 1
    at Object.parse (native)
    at parse (/var/tmp/worker/node_modules/body-parser/lib/types/json.js:84:17)
    at /var/tmp/worker/node_modules/body-parser/lib/read.js:102:18
    at IncomingMessage.onEnd (/var/tmp/worker/node_modules/raw-body/index.js:149:7)
    at IncomingMessage.g (events.js:292:16)
    at emitNone (events.js:86:13)
    at IncomingMessage.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:80:11)
    at process._tickDomainCallback (internal/process/next_tick.js:128:9)

在 firebase 方面,我正在使用一个可调用的函数,这是记录 firebase 控制台日志的地方

on the firebase side I am using a function using a callable, this is where the firebase console logs are being recorded from

export const finalizeProfile = functions.https.onCall((data, context) => { 
    //CODE 
});

是否有人能够发现我可能做错了什么?

Is anyone able to spot what I may be doing incorrectly?

推荐答案

解决方案被隐藏在众目睽睽之下.该问题与缺少的字段有关.对于 Firebase Cloud Functions,错误消息 body is missing data 中提到的内容body",字面意思是它需要一个名为 data 的键,其中包含您正在传递的数据.

The solution was hidden in plain sight. The issue had to do with a missing field. for Firebase Cloud Functions, the contents 'body', as referred to in the error message body is missing data, literally means it requires a key named data which contains the object of data you are passing.

谷歌文档对此并不十分清楚,因为他们缺少一个示例 https://firebase.google.com/docs/functions/callable-reference#request_body

The google docs are not(ish) crystal clear on this, as they are missing an example https://firebase.google.com/docs/functions/callable-reference#request_body

这就是必须将数据发送到 functions.https.onCall() 的方式,注意数据字段与不包含此内容的原始问题相比:

This is how the data must be sent to functions.https.onCall(), note the Data Field as compared to the original question which did not include this:

{
   "data":{ 
      "uid":"123456789",
      "displayName":"James",
      "greeting":"My Greeting!",
      "avatarSrc":"http://cdn.free.com/someImage.jpg",
      "heroSrc":"http://cdn.free.com/someImage.jpg",
      "accountType":"per",
      "cityID":1,
      "cityName":"Eugene",
      "country":"OR",
      "state":"AL"
   }
}

现在可以运行的结果代码如下所示:

The resulting code that now works looks as follows:

// Helper function to format any map to be used for Firebase
Map prepMapForFirebaseJSON(Map<String, dynamic> mapData){
    Map<String, Map<String, dynamic>> _fireJson = {
      'data' : mapData
    };
    return _fireJson;
}

// Process HTTP request
final Uri _uri = Uri.parse(functionUrl);
final String _jsonData = json.encode(prepMapForFirebaseJSON(mapData));
final String _userToken = await AuthenticationService.getUserToken();

HttpClient client = new HttpClient();
HttpClientRequest request = await client.postUrl(_uri);
request.headers.set('Authorization', 'Bearer ' + _userToken);
request.headers.set('Content-Type', 'application/json; charset=utf-8');
request.write(_jsonData);
request.close();

这篇关于Dart json.encode 没有按照 Firebase 函数的需要进行编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆