我正在使用Azure功能开发Chatbot。我想从文件加载Chatbot的一些对话。我正在寻找一种方法来加载这些对话数据之前功能应用程序启动一些函数回调。有没有办法在启动功能应用程序时加载对话数据一次?
这个问题实际上是Azure Function run code on startup的副本。但是这个问题被要求用于C#,我想在NodeJS中做同样的事情
答案 0 :(得分:0)
您可以在执行函数之前使用全局变量加载数据。
var data = [1, 2, 3];
module.exports = function (context, req) {
context.log(data[0]);
context.done();
};
data
变量只初始化一次,将在函数调用中使用。
答案 1 :(得分:0)
我有一个类似的用例,我也坚持使用。
基于这个资源,我找到了一种很好的方法来处理我的代码结构。这很简单:你只需要在声明module.exports之前运行初始化代码。
https://github.com/rcarmo/azure-functions-bot/blob/master/bot/index.js
我也读过这个帖子,但看起来并不像推荐的解决方案。
https://github.com/Azure/azure-functions-host/issues/586
然而,在我的情况下,我还有一个额外的复杂因素,我需要使用promises,因为我正在等待外部服务回来。这些承诺在bot.initialise()中运行。 Initialise()似乎只在第一次调用bot时运行。哪个会好的,但是因为它正在运行一个承诺,我的代码不会阻止 - 这意味着当它调用' listener(req,context.res)'它还不存在。
接下来我将尝试重构我的代码,以便bot.initialise返回一个promise,但是如果有一个初始化webhook可以保证其中的代码在启动之前在其他所有内容中执行,那么代码就会简单得多
有没有人找到一个好的解决方法?
我的代码看起来像这样:
var listener = null;
if (process.env.FUNCTIONS_EXTENSION_VERSION) {
// If we are inside Azure Functions, export the standard handler.
listener = bot.initialise(true);
module.exports = function (context, req) {
context.log("Passing body", req.body);
listener(req, context.res);
}
} else {
// Local server for testing
listener = bot.initialise(false);
}
答案 2 :(得分:0)
经过一周的折腾,我找到了一个可行的解决方案。
首先是一些上下文: 手头的问题,运行自定义代码@ App Start for Node JS Azure Functions。 该问题目前正在讨论 here,并且已经开放了将近 5 年,而且似乎没有任何进展。
截至目前,有一个 Azure Functions“预热”触发功能,可在此处找到 AZ Funcs Warm Up Trigger。但是,此触发器仅按规模运行。因此,您应用的第一个初始实例不会运行“预热”代码。
解决方案:
我创建了一个 start.js
文件并将以下代码放入其中
const ErrorHandler = require('./Classes/ErrorHandler');
const Validator = require('./Classes/Validator');
const delay = require('delay');
let flag = false;
module.exports = async () =>
{
console.log('Initializing Globals')
global.ErrorHandler = ErrorHandler;
global.Validator = Validator;
//this is just to test if it will work with async funcs
const wait = await delay(5000)
//add additional logic...
//await db.connect(); etc // initialize a db connection
console.log('Done Waiting')
}
要运行此代码,我只需要做
require('../start')();
在我的任何功能中。只有一个功能没问题。由于在部署代码时会加载所有函数依赖项,因此只要此行位于其中一个函数中,start.js
就会运行并初始化所有全局/单例变量或您希望它执行的任何其他操作在功能启动时。我做了一个名为“startWarmUp”的文字函数,它只是一个定时器触发的函数,每天运行一次。
我的用例是几乎每个函数都依赖于 ErrorHandler 和 Validator 类。虽然通常将某些东西设为全局变量是不好的做法,但在这种情况下,我认为将这 2 个类设为全局变量没有任何危害,因此它们可用于所有函数。
旁注:在本地开发时,您必须在您的 func start --functions <function requiring start.js> <other funcs>
中包含那个函数,以便实际运行该启动代码。