【问题标题】:insertOne saves numeric values of object as string?insertOne 将对象的数值保存为字符串?
【发布时间】:2023-03-07 21:45:01
【问题描述】:

我正在通过 webhook 从 Google Apps 脚本向 Mongo Stitch(使用 http 服务)发送一个对象。输入对象是 {A=185, B=8, C=200},一旦插入 DB,它就变成 {A="185", B="8", C="200"}。如何避免数字保存在数据库中时被转换为字符串?

在 Google Apps 脚本端我有:

function sendToStitch(){
  var obj = {A=185, B=8, C=200};
  var options = {
      'method' : 'post',
      'payload' : obj
    };
  var insertID = UrlFetchApp.fetch('https://eu-west-1.aws.webhooks.mongodb-stitch.com/api/client/v2.0/app/timesheetstest-fgidp/service/sheets/incoming_webhook/import', options);
} 

在 Stitch 端我有一个 http 服务:

exports = async function(payload) {
   const mongodb = context.services.get("mongodb-atlas");
   const eventsdb = mongodb.db("time");
   const eventscoll = eventsdb.collection("sheets");
   const result = await eventscoll.insertOne(payload.query);
   var id = result.insertedId.toString();
   if(result) {
      return JSON.stringify(id,false,false);   
   }
   return { text: `Error saving` };
}

如何确保插入的对象值是数字类型? (与输入对象相同,我验证了此 Google Apps 脚本端)。

有什么建议吗?

谢谢!

【问题讨论】:

    标签: json mongodb post google-apps-script mongodb-stitch


    【解决方案1】:

    如何确保插入的对象值是数字类型? (与输入对象相同,我验证了这个 Google Apps 脚本端)。

    根据 Google Apps 脚本UrlFetchApp 的文档。 payload 可以是字符串、字节数组、blob 或 JavaScript 对象。 JavaScript 对象被解释为表单字段名称到值的映射,其中的值可以是字符串或 blob

    我认为这就是为什么数据是字符串的原因,因为正在发送的对象被转换为:

    {"A": "185", "B": "8", "C":"200"}
    

    确保数字保持数字的方法之一是以Extended JSON 格式发送数据。首先,在 Google Apps Script 中将 JavaScript 对象转换为 JSON 字符串:

    选项 A)

    function sendToStitch(){
      var obj = {A:285, B:28, C:300};
      var options = {
          'method' : 'post',
          'contentType': 'application/json',
          'payload' : JSON.stringify(obj)
        };
      var insertID = UrlFetchApp.fetch('https://eu-west-1.aws.webhooks.mongodb-stitch.com/api/client/v2.0/app/timesheetstest-fgidp/service/sheets/incoming_webhook/import', options);
    } 
    

    选项 B)

    function sendToStitch(){
      var obj = {"A": {"$numberLong": "185"}, 
                 "B": {"$numberLong": "8" }, 
                 "C": {"$numberLong": "200"}};
      var options = {
          'method' : 'post',
          'contentType': 'application/json',
          'payload' : JSON.stringify(obj)
        };
      var insertID = UrlFetchApp.fetch('https://someurl/incoming_webhook', options);
    } 
    

    MongoDB Stitch Functions 中,您可以使用EJSON.parse() 解析输入。例如:

    exports = async function(payload) {
       let doc = EJSON.parse(payload.body.text());
       const coll = context.services.get("mongodb-atlas")
                              .db("time")
                              .collection("sheets");
       const result = await coll.insertOne(doc);
       if(result) {
          return result;
       }
       return { text: `Error saving` };
    }
    

    【讨论】:

    • 如果我在选项中有 'contentType': 'application/json' ,到达 Stitch 的是带有 payload.query={} 的有效负载(有效负载的其余部分很好,它甚至反映正确的“内容长度”:[“71”])。如果我没有 contentType 行,我会得到 "query":{"{\"A\":{\"$numberLong\":185},\"B\":{\"$numberLong\":8 },\"C\":{\"$numberLong\":200}}":""},但无法解析(试过 JSON.parse(payload.query) & EJSON.parse(payload.query )从Stitch-side无济于事)。有任何想法吗? UrlFetchApp 工作正常,使用与 webhook.site 不同的 URL 对其进行了测试。问题似乎出在 Stitch 方面
    • @jlo,当您设置为application/json 时,您是否还JSON.stringify() 有效载荷?您是否也可以尝试在 Stitch 中查看 payload.body 是什么?你可以试试:const body = payload.body? payload.body.text() : payload body; 然后做const data = EJSON.parse(body); 你得到的发布的行很有趣,因为 JSON 键是你所追求的值。
    • 非常感谢,成功了。所以整个事情的关键是,当发送一个“应用程序/json”有效负载时,它在payload.body而不是payload.query中。此功能也不需要 $numberLong(请参阅选项 a)
    猜你喜欢
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多