在函数外声明变量

Declaring variable outside a function

sender_psid 在 app.post 函数内声明。有没有一种方法可以全局声明它,以便底部的函数调用可以访问它?

注意:在函数外部声明它无济于事,因为 webhook.event 在函数外部不存在。

/ Creates the endpoint for our webhook
app.post('/webhook', (req, res) => {

  let body = req.body;

  // Checks this is an event from a page subscription
  if (body.object === 'page') {

    // Iterates over each entry - there may be multiple if batched
    body.entry.forEach(function(entry) {

    // Gets the body of the webhook event
    let webhook_event = entry.messaging[0];
    console.log(webhook_event);


    // Get the sender PSID
    let sender_psid = webhook_event.sender.id;
    console.log('Sender PSID: ' + sender_psid);

    // Check if the event is a message or postback and
    // pass the event to the appropriate handler function
    if (webhook_event.message) {
      msg.handleMessage(sender_psid, webhook_event.message);
    } else if (webhook_event.postback) {
      msg.handlePostback(sender_psid, webhook_event.postback);
    }


  });

    // Returns a '200 OK' response to all requests
    res.status(200).send('EVENT_RECEIVED');
  } else {
    // Returns a '404 Not Found' if event is not from a page subscription
    res.sendStatus(404);
  }

});
//Imports functions from other files
let  msg = require('./msg.js'),
     handleMessage = msg.handleMessage(sender_psid, received_message),
     handlePostback = msg.handlePostback(sender_psid, received_postback),
     callSendAPI = msg.callSendAPI(sender_psid, response);

您永远不需要 node.js 服务器中特定于请求的全局变量。这只是允许不同的请求打败其他请求试图使用的值。如果您的请求处理程序中有任何异步操作,这将是一种并发错误或竞争条件。不要做。不要试图这样做。这是一个糟糕的设计。

相反,您有以下选择:

  1. 将请求处理程序中的任何数据作为函数参数传递给外部函数。
  2. 将数据作为 属性 添加到 reqres 对象(始终特定于请求),然后传递 reqres 反对您的外部函数,以便它可以访问那里的数据。
  3. 将数据作为 属性 添加到您在该请求处理程序中专门创建的某个其他对象,然后将该对象传递给您的外部函数,以便它可以访问那里的数据。

如果您尝试在请求处理程序中创建一些数据,然后您希望在将来的某个请求处理程序中访问这些数据,那么您可以使用 cookie 或会话来保存该数据,然后获取访问权限在来自同一客户的未来请求中。