Dart json.encode未按照Firebase Function的要求进行编码 [英] Dart json.encode is not encoding as needed by Firebase Function
问题描述
我已经在这个问题上工作了一段时间了,但我似乎无法弄清楚问题到底是什么.在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);
然后我将通过以下方式将其发送到Google Cloud函数.
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()
作为
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
中所指的内容主体"实际上意味着它需要一个名为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.
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 Function的要求进行编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!