Как подключиться к базе данных Azure SQL из нескольких конечных точек Azure Functions TypeScript API - PullRequest
0 голосов
/ 20 июня 2020

Я создаю API в Azure функциях, используя TypeScript, с несколькими конечными точками, подключенными к одному и тому же Azure SQL серверу. Каждая конечная точка была настроена с использованием расширения Azure Functions для VS Code с шаблоном HttpTrigger TypeScript. Каждая конечная точка в конечном итоге будет выполнять разные вызовы базы данных, собирая, обрабатывая и сохраняя данные в разных таблицах.

Кажется, нет привязок по умолчанию для Azure SQL (только Storage или Cosmos ), и хотя утомительный используется в некоторых Microsoft документации , он, как правило, не охватывает Azure Функции, которые кажутся работает асинхронно. Более того, другие похожие вопросы StackOverflow, как правило, относятся к стандартному JavaScript и используют синтаксис module.exports = async function (context), а не const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> синтаксис, используемый шаблонами TypeScript HttpTrigger.

Вот что у меня получилось далеко в одной из этих конечных точек, с образцом кода из утомительной документации по умолчанию Azure Функции HttpTrigger:

var Connection = require('tedious').Connection;
var config = {
    server: process.env.AZURE_DB_SERVER,
    options: {},
    authentication: {
      type: "default",
      options: {  
        userName: process.env.AZURE_DB_USER,
        password: process.env.AZURE_DB_PASSWORD,
      }
    }
  };

import { AzureFunction, Context, HttpRequest } from "@azure/functions"

const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
    context.log('HTTP trigger function processed a request.');
    const name = (req.query.name || (req.body && req.body.name));

    if (name) {

        var connection = new Connection(config);
        connection.on('connect', function(err) {
            if(err) {
              console.log('Error: ', err)
            }
            context.log('Connected to database');
        });

        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello " + (req.query.name || req.body.name)
        };
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
};

export default httpTrigger;

Это заканчивается следующим сообщением:

Предупреждение : Неожиданный вызов 'log' в объекте контекста после завершения выполнения функции. Пожалуйста, проверьте асинхронные вызовы, которые не ожидаются, или вызовы 'done', сделанные до завершения выполнения функции. Имя функции: HttpTrigger1. Идентификатор вызова: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Подробнее: https://go.microsoft.com/fwlink/?linkid=2097909

Опять же, документация asyn c, связанная с описанием только стандартного синтаксиса JavaScript module.exports = async function (context), а не синтаксиса, используемого этими TypeScript httpTriggers.

Я также читал, что лучше всего иметь одно соединение, а не подключаться заново каждый раз при вызове этих конечных точек - но опять же не уверен, следует ли это делать в отдельной функции, которая звонят все конечные точки. Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 25 июня 2020

Я рад, что использование пакета узлов 'ms sql' работает для вас:

const sql = require('mssql');
require('dotenv').config();

module.exports = async function (context, req) {
  try {
    await sql.connect(process.env.AZURE_SQL_CONNECTIONSTRING);
    const result = await sql.query`select Id, Username from Users`;
    context.res.status(200).send(result);
  } catch (error) {
    context.log('error occurred ', error);
    context.res.status(500).send(error);
  }
};

Ссылка: { ссылка }

Надеюсь, это поможет.

...