Node.js 为什么Express res.json()会为+;30秒
我正在构建一个应用程序,它可以从一个页面在谷歌工作表中查找单词定义。该应用程序托管在谷歌云函数中,并在Node.js中编写 要对slack命令设置3000ms的时间限制,应用程序Node.js 为什么Express res.json()会为+;30秒,node.js,express,google-sheets,google-cloud-functions,slack-api,Node.js,Express,Google Sheets,Google Cloud Functions,Slack Api,我正在构建一个应用程序,它可以从一个页面在谷歌工作表中查找单词定义。该应用程序托管在谷歌云函数中,并在Node.js中编写 要对slack命令设置3000ms的时间限制,应用程序 立即发布200 OK响应,然后 在工作表中查找,最后 通过Slack的请求url返回完整回复,如中所定义 到目前为止,一切顺利。但关键是: 当我在我的主函数glossary中调用res.json()时,Slack get会给出一个初始回复,但是sendMessageToSlackResponseURL()在接下来的10
200 OK
响应,然后请求url
返回完整回复,如中所定义glossary
中调用res.json()
时,Slack get会给出一个初始回复,但是sendMessageToSlackResponseURL()
在接下来的10-40秒内不会被调用。我最终得到了预期的答复,尽管速度慢得令人痛苦
我已经把它缩小(通过大量令人尴尬的console.log()
调用)到以下行:
const reply=(wait sheets.spreadsheets.values.get(request)).data.values代码>
如果事先未调用res.json()
,则运行此命令需要2-3秒,几乎没有达到空闲时间限制。但是如果前面调用了res.json()
。此命令最多需要40秒
之前的res.json()
调用对Google Sheets API调用有何影响?我错过了什么
// Simplified code pasted below:
exports.glossary = async (req, res) => {
// Give immediate response to prevent 3000ms Slack timeout.
res.json(initSlackResponse(req.body.text)); //Commenting out this line speeds up the app
// Get glossary result from Google Sheet
let response = await getGlossaryResults(query);
// Return late response
await sendMessageToSlackResponseURL(req.body.response_url, response);
return Promise.resolve();
};
const getGlossaryResults = async (query) => {
const content = await readFile(CREDENTIALS_PATH);
let oAuth2Client = await authorize(JSON.parse(content));
const request = {
spreadsheetId: spreadsheetId,
range: range,
auth: oAuth2Client
};
//The following command takes 10-40 seconds to run if res.json(initSlackResponse(query)); has been called.
//If res.json() is *not* called, the command takes 2-3 seconds.
const reply = (await sheets.spreadsheets.values.get(request)).data.values;
// *Generate the results here
return results;
};
function sendMessageToSlackResponseURL(responseURL, JSONmessage) {
let postOptions = {
uri: responseURL,
method: 'POST',
headers: {
'Content-type': 'application/json'
},
json: JSONmessage
};
request(postOptions, (error) => {
if (error){
console.error(error);
}
});
return Promise.resolve();
}
const initSlackResponse = (query) => {
return {
// *Build simple json object here
};
};
我可以问一下res.json(initSlackResponse(req.body.text))
和res.json(initSlackResponse(req.body.text))
的res
吗?当然可以res.json(…)
是通过响应Slack的响应对象。运行此命令时,我会在几毫秒后收到在initSlackResponse
中生成的应答。当我从Slack调用我的函数glossary
时,req
和res
被传递req
具有来自Slack的请求res
附带了一些用于回复原点的函数。不确定这是否回答了您的问题?谢谢您的回答。不幸的是,我无法理解res.json(…)
。我为我的理解力差道歉。顺便说一句,虽然我不确定这是否与问题的原因有关,例如,作为测试情况,当res.json(initSlackResponse(req.body.text))的顺序为代码>和let response=等待getGlossaryResults(查询)代码>被交换为let response=wait getGlossaryResults(查询)
和res.json(initSlackResponse(req.body.text))代码>,你会得到什么结果?非常感谢你帮助调查!交换返回完全相同的行为和结果…感谢您的回复。从完全相同的行为和结果来看,let response=wait-getGlossaryResults(查询)
不影响tores.json(initSlackResponse(req.body.text))代码>,并且,让响应=等待getGlossaryResults(查询)代码>不受res.json(initSlackResponse(req.body.text))的影响代码>。所以我想理解res.json(initSlackResponse(req.body.text))代码>。但我不能理解。我为我的拙劣技能道歉。当我能够正确理解并找到问题的原因时,我想告诉你。