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