Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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
Node.js 为什么Express res.json()会为+;30秒_Node.js_Express_Google Sheets_Google Cloud Functions_Slack Api - Fatal编程技术网

Node.js 为什么Express res.json()会为+;30秒

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

我正在构建一个应用程序,它可以从一个页面在谷歌工作表中查找单词定义。该应用程序托管在谷歌云函数中,并在Node.js中编写

要对slack命令设置3000ms的时间限制,应用程序

  • 立即发布
    200 OK
    响应,然后
  • 在工作表中查找,最后
  • 通过Slack的
    请求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(查询)
    不影响to
    res.json(initSlackResponse(req.body.text)),并且,
    让响应=等待getGlossaryResults(查询)不受res.json(initSlackResponse(req.body.text))的影响。所以我想理解
    res.json(initSlackResponse(req.body.text))。但我不能理解。我为我的拙劣技能道歉。当我能够正确理解并找到问题的原因时,我想告诉你。