Firebase Firestore云功能:POST请求存在问题

Firebase Firestore云功能:POST请求存在问题,firebase,firebase-realtime-database,google-cloud-functions,Firebase,Firebase Realtime Database,Google Cloud Functions,我想使用Firestore云函数将数据发布到我的Firestore数据库。以下是我的JavaScript代码: const admin = require('firebase-admin'); const functions = require('firebase-functions'); admin.initializeApp(); exports.helloWorldJS = functions.https.onRequest((request, response) => {

我想使用Firestore云函数将数据发布到我的Firestore数据库。以下是我的JavaScript代码:

const admin = require('firebase-admin');
const functions = require('firebase-functions');

admin.initializeApp();

exports.helloWorldJS = functions.https.onRequest((request, response) => {
    response.send("identifiant : " + request.body.identifiant);
});

exports.addMesure = functions.https.onRequest((req, res) => {
    const identifiant = req.body.identifiant;

    const mesure = {
        temperature: req.body.temperature,
        phSol: req.body.phSol
    };

    const db = admin.database().ref('/users/' + identifiant + '/mesures');
    db.push({mesure});
    res.send('mesure: ' + mesure);
});
当我使用Postman进行测试时,发送数据:

[{
"identifiant": "identifianttt",
"temperature": 35,
"phSol": 7
}]
helloWorldJS函数返回:标识:未定义 addMesure函数返回:错误:无法处理请求


谢谢您的帮助。

对于第一个问题,您应该再次检查发送的正文是否正确

对于第二个云函数,(在解决了主体的第一个问题之后),您应该调整代码,以等待异步
push()
方法返回的承诺在发送回响应之前得到解决,如下所示:

exports.addMesure = functions.https.onRequest((req, res) => {
    const identifiant = req.body.identifiant;

    const mesure = {
        temperature: req.body.temperature,
        phSol: req.body.phSol
    };

    const dbRef = admin.database().ref('/users/' + identifiant + '/mesures');
    dbRef.push(mesure)  //No need to write {mesure}, since mesure is alreasdy a JS object
    .then(ref => {
         res.send('mesure: ' + mesure);
    })
    .catch(err => {....})

});

最后,我建议您观看Firebase视频系列中关于“JavaScript承诺”的3个视频:。第一个完全涵盖了您的情况(对Firebase db的异步调用,然后发送回响应)

谢谢大家一切正常,我将前面的代码更改为:

const admin = require('firebase-admin');
const functions = require('firebase-functions');

admin.initializeApp();

exports.helloWorld = functions.https.onRequest((req, res) => {
    res.send('identifiant: ' + req.body.identifiant);
});

exports.insertMesure = functions.https.onRequest((req, res) => {
    const identifiant = req.body.identifiant;
    const temperatureAir = req.body.temperatureAir;
    const humiditeSol = req.body.humiditeSol;
    const humiditeAir = req.body.humiditeAir;
    const niveauEau = req.body.niveauEau;
    const phSol = req.body.phSol;

    const mesure = {
        temperatureAir: temperatureAir,
        humiditeSol: humiditeSol,
        humiditeAir: humiditeAir,
        niveauEau: niveauEau,
        phSol: phSol
    };

    const dbRef = admin.database().ref('/users/' + identifiant + '/mesures');
    dbRef.push(mesure);
    // .then(snapchot => {
    //     const data = snapchot;
    //     return data;
    // })
    // .catch(err => {
    //     res.send('Error: ' + err);
    // });
});
我想使用带有以下代码的SIM800L模块通过Arduino发送数据:

#include <Sim800.h>
#include <Http.h>

#include <ArduinoJson.h>


#define BODY_FORMAT "{\"identifiant\":%s, \"temperatureAir\": %d, \"humiditeSol\": %d, \"humiditeAir\": %d, \"phSol\": %d, \"niveauEau\": %d}"

unsigned long lastRunTime = 0;
unsigned long waitForRunTime = 0;

unsigned int RX_PIN = 11; // RX du module
unsigned int TX_PIN = 10; // TX du module
unsigned int RST_PIN = 12;
HTTP http(9600, RX_PIN, TX_PIN, RST_PIN);


// the setup routine runs once when you press reset:
void setup() {
  Serial.begin(9600);
  while(!Serial);
  Serial.println("Starting!");
}

// the loop routine runs over and over again forever:
void loop() {
  // if (shouldTrackTimeEntry()) 
  trackTimeEntry();
}

// functions
void print(const __FlashStringHelper *message, int code = -1){
  if (code != -1){
    Serial.print(message);
    Serial.println(code);
  }
  else {
    Serial.println(message);
  }
}

void trackTimeEntry(){
  char response[32];
  char body[100];
  char auth[50];
  Result result;
  String identifiant = "user_4";
  int temperatureAir = 45;
  int humiditeSol = 23;
  int humiditeAir = 23;
  int phSol = 6;
  int niveauEau = 23;

  print(F("Cofigure bearer: "), http.configureBearer("internet"));
  result = http.connect();
  print(F("HTTP connect: "), result);

  sprintf(body, BODY_FORMAT,identifiant, temperatureAir, humiditeSol, humiditeAir, phSol, niveauEau);
  print(F("body: "), body);

  result = http.post("https://us-central1-MY_PROJET_ID.cloudfunctions.net/insertMesure", body, response);
  print(F("HTTP POST: "), result);

  print(F("HTTP disconnect: "), http.disconnect());

  delay(10000);
}
#包括
#包括
#包括
#定义正文格式“{\'标识物\”:%s、\'温度空气\”:%d、\'腐殖酸盐\':%d、\'腐殖酸盐\':%d、\'phSol \':%d、\'niveauEau\:%d}”
无符号长lastRunTime=0;
无符号长waitForRunTime=0;
无符号整数RX_PIN=11;//接收du模块
无符号整数TX_PIN=10;//发送数据单元模块
无符号int RST_引脚=12;
HTTP(9600,RX_引脚,TX_引脚,RST_引脚);
//按“重置”时,设置例程运行一次:
无效设置(){
Serial.begin(9600);
而(!串行);
Serial.println(“开始!”);
}
//循环例程会一直反复运行:
void循环(){
//if(shouldTrackTimeEntry())
trackTimeEntry();
}
//功能
无效打印(常量uu FlashStringHelper*消息,int代码=-1){
如果(代码!=-1){
串行打印(消息);
Serial.println(代码);
}
否则{
Serial.println(消息);
}
}
void trackTimeEntry(){
字符响应[32];
炭体[100];
charauth[50];
结果;
字符串标识符=“用户_4”;
内部温度air=45;
int humiditeSol=23;
int-air=23;
int phSol=6;
int niveauEau=23;
打印(F(“cofigurebearer”)、http.configureBearer(“internet”);
结果=http.connect();
打印(F(“HTTP连接”)、结果;
sprintf(body,body_格式,识别剂,温度空气,腐殖土,腐殖土,phSol,niveauEau);
印刷品(F(“正文”)、正文;
结果=http.post(“https://us-central1-MY_PROJET_ID.cloudfunctions.net/insertMesure“、身体、反应);
打印(F(“HTTP POST:”),结果);
打印(F(“HTTP断开连接”)、HTTP.disconnect();
延迟(10 000);
}
但是服务器向我发送了一个
400错误代码

我应该如何格式化请求?

您确定要在正文中发送对象吗?你能分享你的邮递员代码吗?请注意,你使用了google cloud firestore标签,但你问题中的代码是关于Firebase实时数据库的,你这是什么意思?我不明白嗨,你“附加”在问题上的标签不是100%准确。这不是什么非常重要的事情,但我只是想提醒您注意这一点,因为您是Stack Overflow的新用户!:-)我已经修改了标签,非常感谢。