首页 > 解决方案 > 将 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;
};

标签: node.jsfirebasegoogle-cloud-functionsbotframework

解决方案


我将echo bot 示例用作 Firebase 函数。示例中的文件都应该放在您的functions文件夹中,其中 index.js、bot.js 和 .env 是重要的。我对 index.js 进行了一些修改,以便它使用expressand 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 中机器人资源的设置刀片中使用已部署的终结点。


推荐阅读