SignalR-连接。启动失败

时间:2018-11-20 16:07:05

标签: javascript azure signalr azure-functions

我尝试从 Anthony Chu 运行该教程。 https://www.youtube.com/watch?v=4d0wor7uAgQ

他使用Azure CosmosDB,Azure Functions和SignalR实现了“ SimpleChat-Application”。可以在客户端之间实时发送消息的位置。 我尝试了不同的设置和版本,但无法使用。

“ index.html”中的源代码:(JavaScript)

  <script src="https://unpkg.com/@aspnet/signalr@1.0.0-rc1-final/dist/browser/signalr.js"></script>
  <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

  <script>
    const apiBaseUrl = 'http://localhost:7071';
    const hubName = 'chat';
    getConnectionInfo().then(info => {      
      let username;
      while (!username && username !== null) {
        username = prompt('Enter a username');
      }
      console.log(info.accessTokenFactory);
      if (username === null) return;
      document.body.classList.add('ready');
      const messageForm = document.getElementById('message-form');
      const messageBox = document.getElementById('message-box');
      const messages = document.getElementById('messages');
      const options = {
        accessTokenFactory: () => info.accessKey
      };

      const connection = new signalR.HubConnectionBuilder()
        .withUrl(info.url, options)
        .configureLogging(signalR.LogLevel.Trace)
        .build();

      connection.onclose(() => console.log('disconnected'));

      console.log('retrieving messages');

      getMessage().then(messages => {
        for(let m of messages) {
          newMessage(m);
        }
        console.log('connecting...');
        connection.start()
          .then(() => console.log('connected!'))
          .catch(console.error);
      });
      console.log('connected after');
    }).catch(alert);

    function getConnectionInfo() {
      console.log("test");
      return axios.post(`${apiBaseUrl}/api/negotiate`)
        .then(resp => resp.data);
    }

    function getMessage(sender, messageText) {
      return axios.get(`${apiBaseUrl}/api/getmessage`).then(resp => resp.data);
    }

    function newMessage(message) {
      const newMessage = document.createElement('li');
      newMessage.appendChild(document.createTextNode(`${message.sender}: ${message.text}`));
      messages.prepend(newMessage);
    }
  </script>

源代码(协商-function.json)

{
  "disabled": false,
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
      "type": "signalRConnectionInfo",
      "name": "connectionInfo",
      "hubName": "chat",
      "connectionStringSetting": "AzureSignalRConnectionString", 
      "direction": "in"
    }
  ]
}

源代码(协商-index.js)

module.exports = function (context, req, connectionInfo) {
    context.res = { body: connectionInfo };
    context.done();
}

我可以从cosmosDB接收数据,但是当我使用connection.start()方法...它没有连接到服务吗?!

有人可以帮助我吗?

非常感谢!

版本:

  • Func(2.2.70)

  • Microsoft.Azure.WebJobs.Extensions.SignalRService(1.0.0-preview1-10002)

  • Microsoft.Azure.WebJobs.Extensions.CosmosDB(3.0.2)

  • Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator(1.0.1)

(“ Me:Hallo”是CosmosDB中的条目)

Result Page with Console-Log

1 个答案:

答案 0 :(得分:1)

请注意代码的这一部分...

      const options = {
        accessTokenFactory: () => info.accessKey
      };

      const connection = new signalR.HubConnectionBuilder()
        .withUrl(info.url, options)
        .configureLogging(signalR.LogLevel.Trace)
        .build();

更改

=> info.accessKey

然后插入

=> info.accessToken

由于值未定义,连接失败!