node.js - 将 microsoft bots nodejs 部署到 firebase 功能
问题描述
我使用带有 nodejs 的 microsoft bot 框架开发了一个简单的机器人。代码只是两个文件,如下所示。
我在 google firebase 函数文档上看到https://firebase.google.com/docs/functions/http-events#using_existing_express_apps
看来我可以简单地将我的 ms bot nodejs 部署到 firebase。问题是我应该怎么做。
应用程序.js
'use strict';
var express = require('express');
var app = express();
// Adding a bot to our app
var bot = require('./bot');
bot.setup(app);
// Adding a messaging extension to our app
var messagingExtension = require('./messaging-extension');
messagingExtension.setup();
// Deciding which port to use
var port = process.env.PORT || 3333;
// Start our nodejs app
app.listen(port, function() {
console.log(`App started listening on port ${port}`);
});
bot.js
'use strict';
module.exports.setup = function(app) {
var builder = require('botbuilder');
var teams = require('botbuilder-teams');
var config = require('config');
if (!config.has("bot.appId")) {
process.env.NODE_CONFIG_DIR = "../config";
delete require.cache[require.resolve('config')];
config = require('config');
}
// Create a connector to handle the conversations
var connector = new teams.TeamsChatConnector({
appId: config.get("bot.appId"),
appPassword: config.get("bot.appPassword")
});
var inMemoryBotStorage = new builder.MemoryBotStorage();
var bot = new builder.UniversalBot(connector, async function(session) {
session.send("Hello world");
}).set('storage', inMemoryBotStorage);
// Setup an endpoint on the router for the bot to listen.
// NOTE: This endpoint cannot be changed and must be api/messages
app.post('/api/messages', connector.listen());
// Export the connector for any downstream integration - e.g. registering a messaging extension
module.exports.connector = connector;
};
解决方案
我将echo bot 示例用作 Firebase 函数。示例中的文件都应该放在您的functions
文件夹中,其中 index.js、bot.js 和 .env 是重要的。我对 index.js 进行了一些修改,以便它使用express
and not restify
,但目前还不清楚这是否真的有必要。我最终的 index.js 看起来像这样(注意firebase-functions
包的使用):
const functions = require('firebase-functions');
const dotenv = require('dotenv');
const path = require('path');
const express = require('express');
// Import required bot services.
// See https://aka.ms/bot-services to learn more about the different parts of a bot.
const { BotFrameworkAdapter } = require('botbuilder');
// This bot's main dialog.
const { EchoBot } = require('./bot');
// Import required bot configuration.
const ENV_FILE = path.join(__dirname, '.env');
dotenv.config({ path: ENV_FILE });
// Create adapter.
// See https://aka.ms/about-bot-adapter to learn more about how bots work.
const adapter = new BotFrameworkAdapter({
appId: process.env.MicrosoftAppId,
appPassword: process.env.MicrosoftAppPassword
});
// Catch-all for errors.
adapter.onTurnError = async (context, error) => {
// This check writes out errors to console log .vs. app insights.
console.error(`\n [onTurnError]: ${error}`);
// Send a message to the user
await context.sendActivity(`Oops. Something went wrong!`);
};
// Create the main dialog.
const bot = new EchoBot();
// Listen for incoming requests.
const app = express();
app.post('/api/messages', (req, res) => {
adapter.processActivity(req, res, async (context) => {
// Route to main dialog.
await bot.run(context);
});
});
// Expose Express API as a single Cloud Function:
exports.bot = functions.https.onRequest(app);
你的 bot 的 Microsoft 应用 ID 和密码需要在 .env 文件中,因为它们用于对来自 Microsoft Teams 的请求进行身份验证。为此,机器人必须向自然不属于 Google 的外部令牌服务器发出请求。您需要付费计划才能让您的函数调用这样的外部 API,如您在此处看到的:使用 firebase 云函数将 POST 请求发送到非谷歌服务器
使用免费计划,您仍然可以使用firebase emulators:start
. 但是,听起来您已经有了付费计划,所以我相信这对您来说应该不是问题。无论是在本地运行您的机器人还是部署,您的端点都应该以/bot/api/messages
(如果您像我一样使用“bot”作为您的函数名称)结束。部署机器人后,可以在 Azure 中机器人资源的设置刀片中使用已部署的终结点。
推荐阅读
- android - 如何使用 kotlin 使用 android 设置默认相机
- rest - REST API - 请求参数中的特殊字符
- r - 如何直接用向量标记数据框的列名
- isabelle - 在没有 GUI 的情况下与 Isabelle 交互
- python - 尝试导入“matplotlib”(已安装),出现以下错误:
- wordpress - 如何修复我的 localhost 或 apache 配置?
- android - Android MediPlayer prepareAsync() java.lang.IllegalStateException
- javascript - SQL 滞后与 jquery 变量
- javascript - VUEJS - 将我的方法的返回绑定到我的子模板
- javascript - 从当前帖子自定义字段中提取简码并在 Wordpress 中执行