Объявление переменной вне функции - PullRequest
0 голосов
/ 29 июня 2018

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);

1 Ответ

0 голосов
/ 29 июня 2018

Вам НИКОГДА не нужны глобальные переменные, специфичные для запроса на серверах node.js. Это просто позволяет различным запросам нарушать значения, которые другие запросы пытаются использовать. Если в ваших обработчиках запросов есть какие-либо асинхронные операции, это может быть формой ошибки параллелизма или состояния гонки. Не делай этого. Не пытайтесь это сделать. Это плохой дизайн.

Вместо этого у вас есть следующие опции:

  1. Передайте любые данные из вашего обработчика запроса в качестве аргумента функции во внешнюю функцию.
  2. Добавьте данные как свойство к объекту req или res (который всегда зависит от запроса), а затем передайте этот объект req или res вашей внешней функции, чтобы он мог получить доступ к данным там .
  3. Добавьте данные как свойство к другому объекту, который вы специально создали в этом обработчике запросов, а затем передайте этот объект вашей внешней функции, чтобы он мог получить доступ к данным там.

Если вы пытаетесь создать некоторые данные в обработчике запросов, к которым вы затем хотите получить доступ в каком-либо будущем обработчике запросов, то вы бы использовали куки или сеанс, чтобы иметь возможность сохранить эти данные, а затем получить к ним доступ в будущем запросе от того же клиента.

...