Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 来自google sheets的补丁请求覆盖了以前的post请求_Javascript_Node.js_Mongodb_Express_Google Apps Script - Fatal编程技术网

Javascript 来自google sheets的补丁请求覆盖了以前的post请求

Javascript 来自google sheets的补丁请求覆盖了以前的post请求,javascript,node.js,mongodb,express,google-apps-script,Javascript,Node.js,Mongodb,Express,Google Apps Script,我正在从google表单向mongodb数据库发送12个单元格值。我这样做的原因是因为我想连接12个单元格,对数据进行一些转换,然后在后面的某个地方将其输出到前端。我之所以这样做,也是因为表格将每个单元格限制为50k个字符,我每次需要向数据库发送大约500k个字符。我在这里的最初假设是,我需要在MondoDB中创建一个包含所有12个单元格值的记录,可能的另一种方法是只在一个集合中发布12个单独的记录。因此,我现在的做法是,在最初发布的记录中,在谷歌表单中的一个谷歌脚本功能中,执行一个POST请求

我正在从google表单向mongodb数据库发送12个单元格值。我这样做的原因是因为我想连接12个单元格,对数据进行一些转换,然后在后面的某个地方将其输出到前端。我之所以这样做,也是因为表格将每个单元格限制为50k个字符,我每次需要向数据库发送大约500k个字符。我在这里的最初假设是,我需要在MondoDB中创建一个包含所有12个单元格值的记录,可能的另一种方法是只在一个集合中发布12个单独的记录。因此,我现在的做法是,在最初发布的记录中,在谷歌表单中的一个谷歌脚本功能中,执行一个POST请求,然后可能执行11个补丁请求。我遇到的问题是,我不确定如何形成模型、路线和请求。每次我做下面显示的补丁时,它都会覆盖以前的POST数据。我希望它只更新通过补丁请求发送的JSON部分。当前,补丁请求将每隔一条记录更改为null,并删除以前的POST数据。我知道有一种方法可以只修补集合中的特定记录,但如何修补集合中json的特定部分,我不知道

邮政快线:

router.post('/', async (req,res) => {
  const post = new Post({
    title: req.body.title,
    en1: req.body.en1,
    en2: req.body.en2,
    en3: req.body.en3,
    en4: req.body.en4,
    fr1: req.body.fr1,
    fr2: req.body.fr2,
    fr3: req.body.fr3,
    fr4: req.body.fr4,
    de1: req.body.de1,
    de2: req.body.de2,
    de3: req.body.de3,
    de4: req.body.de4
  });

  try {
    const savedPost = await post.save();
    res.json(savedPost);
  } catch (err) {
    res.json({ message: err })
  }
})
快速更新路线:

router.patch('/:postId', async (req,res) => {
  try {
    const updatedPost = await Post.updateOne(
      { title:req.params.postId }, 
      { $set: {
        title: req.body.title,
        en1: req.body.en1,
        en2: req.body.en2,
        en3: req.body.en3,
        en4: req.body.en4,
        fr1: req.body.fr1,
        fr2: req.body.fr2,
        fr3: req.body.fr3,
        fr4: req.body.fr4,
        de1: req.body.de1,
        de2: req.body.de2,
        de3: req.body.de3,
        de4: req.body.de4 
      } }
    )
    res.json(updatedPost)
  }catch(err){
    res.json({ message: err })
  }
})
猫鼬模型:

const mongoose = require('mongoose')

const PostSchema = mongoose.Schema({
  title: {
    type: String,
    required: false
  },
  en1: {
    type: String,
    required: false
  },
  en2: {
    type: String,
    required: false
  },
  en3: {
    type: String,
    required: false
  },
  en4: {
    type: String,
    required: false
  },
  fr1: {
    type: String,
    required: false
  },
  fr2: {
    type: String,
    required: false
  },
  fr3: {
    type: String,
    required: false
  },
  fr4: {
    type: String,
    required: false
  },
  de1: {
    type: String,
    required: false
  },
  de2: {
    type: String,
    required: false
  },
  de3: {
    type: String,
    required: false
  },
  de4: {
    type: String,
    required: false
  },
  date: {
    type: Date,
    default: Date.now
  }
})

module.exports = mongoose.model('Posts', PostSchema)
目前只有一个补丁请求的工作表中的GOOGLE脚本发布请求:

function sendInfoToApi() {
  const randomId = Math.random()*100000000000000000;

  var en1 = SpreadsheetApp.getActive().getSheetByName("Final").getRange('A3').getValues()[0][0];
  var en2 = SpreadsheetApp.getActive().getSheetByName("Final").getRange('A4').getValues()[0][0];

  // 11111 POST REQUEST //
  var data1 = {
    "title": randomId,
    "en1": en1
  }
  var payload1 = JSON.stringify(data1)  
  var url1 = 'https://ag-sheets-api.herokuapp.com/posts';
  var fetchParameters1 = {
      'method': 'post',
      'contentType': 'application/json', 
      'payload' : payload1,
      'muteHttpExceptions' : false
  };
  try {
      var response = UrlFetchApp.fetch(url1, fetchParameters1);
      } catch(e){
        Logger.log(e)
  }

  // 22222 PATCH REQUEST //
  var data2 = {
    "title": randomId,
    "en2": en2
  }
  var payload2 = JSON.stringify(data2)  
  var url2 = `https://ag-sheets-api.herokuapp.com/posts/${randomId}`;
  var fetchParameters2 = {
      'method': 'patch',
      'contentType': 'application/json', 
      'payload' : payload2,
      'muteHttpExceptions' : false
  };
  try {
      var response = UrlFetchApp.fetch(url2, fetchParameters2);
      } catch(e){
        Logger.log(e)
  }
}
MONGODB中的结果记录:

  _id:60072da8c52278001791e22e
title:"42612001948065650"
en1:null
date:2021-01-19T19:06:16.052+00:00
__v:0
de1:null
de2:null
de3:null
de4:null
en2:"<div class="qw">
        <div class="qe" data-country="gq.svg"> <p cla..."
en3:null
en4:null
fr1:null
fr2:null
fr3:null
fr4:null

在这里,您可以看到修补程序请求如何将en1中的数据覆盖为null,如何使其仅更新en2,并跳过其他值?

问题是,即使请求中不存在这些参数,您也要检索所有参数。因此,在所有属性中返回null

en1:req.body.en1, en2:req.body.en2, en3:req.body.en3, en4:req.body.en4, fr1:req.body.fr1, fr2:req.body.fr2, fr3:req.body.fr3, fr4:req.body.fr4, de1:req.body.de1, de2:req.body.de2, de3:req.body.de3, de4:req.body.de4 你只派了一个,不是全部。 您应该在请求键上循环,并且仅限于这些键

路由器.patch'/:postId',异步请求,res=>{ 试一试{ const updatedObj={}; forlet i在请求体中{ ifreq.body.hasOwnPropertyi&&i.match/^title|en|fr|de[1-4]$/updatedObj[i]=req.body[i]; } const updatedPost=wait Post.updateOne {title:req.params.postId}, {$set:updatedObj} res.jsonupdatedPost }捕手{ res.json{message:err} } }
我在属性发送中添加了一些正则表达式验证,以避免设置不希望web请求更新的其他键。如果请求受信任,则可以删除该参数。

问题是,即使请求中不存在所有参数,也要检索所有参数。因此,在所有属性中返回null

en1:req.body.en1, en2:req.body.en2, en3:req.body.en3, en4:req.body.en4, fr1:req.body.fr1, fr2:req.body.fr2, fr3:req.body.fr3, fr4:req.body.fr4, de1:req.body.de1, de2:req.body.de2, de3:req.body.de3, de4:req.body.de4 你只派了一个,不是全部。 您应该在请求键上循环,并且仅限于这些键

路由器.patch'/:postId',异步请求,res=>{ 试一试{ const updatedObj={}; forlet i在请求体中{ ifreq.body.hasOwnPropertyi&&i.match/^title|en|fr|de[1-4]$/updatedObj[i]=req.body[i]; } const updatedPost=wait Post.updateOne {title:req.params.postId}, {$set:updatedObj} res.jsonupdatedPost }捕手{ res.json{message:err} } }
我在属性发送中添加了一些正则表达式验证,以避免设置不希望web请求更新的其他键。如果请求是可信的,您可以删除它。

在ag-sheets-api.herokuapp.com的后端有什么?谁解析补丁数据?它是由节点/mongodb路由代码解析的,我已经在ag-sheets-api.herokuapp.com上展示了后端的代码?谁解析补丁数据?它是由node/mongodb路由代码解析的,我已经展示过了,谢谢!hasOwnProperty是一个我不知道的好地方!正则表达式中的“^”和“$”是否表示每行匹配一次?我不完全明白那到底是什么means@AGrush^表示行的开始,$表示行的结束。我添加这个是因为我们想匹配整个关键字,否则它会接受plaplaen1plalayou可以循环Object.keys,而不是因为不匹配谢谢!hasOwnProperty是一个我不知道的好地方!正则表达式中的“^”和“$”是否表示每行匹配一次?我不完全明白那到底是什么means@AGrush^表示行的开始,$表示行的结束。我添加这个是因为我们希望匹配整个关键字,否则它将接受plaplaen1plalayou可以循环Object.keys而不是for in