在函数外声明变量
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 服务器中特定于请求的全局变量。这只是允许不同的请求打败其他请求试图使用的值。如果您的请求处理程序中有任何异步操作,这将是一种并发错误或竞争条件。不要做。不要试图这样做。这是一个糟糕的设计。
相反,您有以下选择:
- 将请求处理程序中的任何数据作为函数参数传递给外部函数。
- 将数据作为 属性 添加到
req
或 res
对象(始终特定于请求),然后传递 req
或 res
反对您的外部函数,以便它可以访问那里的数据。
- 将数据作为 属性 添加到您在该请求处理程序中专门创建的某个其他对象,然后将该对象传递给您的外部函数,以便它可以访问那里的数据。
如果您尝试在请求处理程序中创建一些数据,然后您希望在将来的某个请求处理程序中访问这些数据,那么您可以使用 cookie 或会话来保存该数据,然后获取访问权限在来自同一客户的未来请求中。
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 服务器中特定于请求的全局变量。这只是允许不同的请求打败其他请求试图使用的值。如果您的请求处理程序中有任何异步操作,这将是一种并发错误或竞争条件。不要做。不要试图这样做。这是一个糟糕的设计。
相反,您有以下选择:
- 将请求处理程序中的任何数据作为函数参数传递给外部函数。
- 将数据作为 属性 添加到
req
或res
对象(始终特定于请求),然后传递req
或res
反对您的外部函数,以便它可以访问那里的数据。 - 将数据作为 属性 添加到您在该请求处理程序中专门创建的某个其他对象,然后将该对象传递给您的外部函数,以便它可以访问那里的数据。
如果您尝试在请求处理程序中创建一些数据,然后您希望在将来的某个请求处理程序中访问这些数据,那么您可以使用 cookie 或会话来保存该数据,然后获取访问权限在来自同一客户的未来请求中。