Ошибка неверного типа при использовании Msgpack с Flask и AngularJS - PullRequest
0 голосов
/ 16 октября 2018

У меня есть простое приложение Flask, например:

import msgpack
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
  return render_template('index.html')

@app.route('/test')
def test():
    return msgpack.packb([1, 2, 3])

@app.route('/ping')
def ping():
    return "Pong"

if __name__ == '__main__':
    app.run(debug=True, port=5000)

В маршруте Flask /test я использую msgpack для упаковки массива, который возвращается в ответ.Когда этот ответ выводится на консоль, он выглядит примерно так: b'\x93\x01\x02\x03'

Я использую AngularJS 1.7 в моем интерфейсе, который выглядит следующим образом:

<!doctype html>
<html ng-app="MyApp">
  <body ng-cloak>
    <div class="container" ng-controller="MyController">
      <h1>Hello, {{text}}</h1>
      <button class="btn btn-primary" ng-click="ping()">Ping</button>
      <button class="btn btn-primary" ng-click="getMsgpackData()">Get Msgpack Data</button>
    </div>

    <script src="jquery-3.3.1.slim.min.js"></script>
    <script src="/angular.js/1.7.2/angular.min.js"></script>
    <script src="https://rawgithub.com/kawanet/msgpack-lite/master/dist/msgpack.min.js"></script>
    <script>
      var myApp = angular.module("MyApp", []);

      myApp.controller("MyController", ["$scope", "$http", function($scope, $http) {
        $scope.text = "World";

        $scope.ping = function() {
          $http.get("/ping").then(function success(response) {
              $scope.text = response.data;
          }, function error(response) {
              console.log(response);
          });
        }

        $scope.getMsgpackData = function() {
          $http.get("/test").then(function success(response) {
              console.log(response);
              $scope.text = msgpack.decode(response.data);
          }, function error(response) {
              console.log(response);
          });
        }
      }]);
    </script>
  </body>
</html>

Когда *Функция 1011 * вызывается в MyController, в консоли браузера появляется следующая ошибка:

Error: Invalid type: 0x�
    at n.r [as decode] (msgpack.min.js:1)
    at n.fetch (msgpack.min.js:1)
    at n.s [as read] (msgpack.min.js:1)
    at Object.n [as decode] (msgpack.min.js:1)
    at success ((index):46)
    at angular.js:17396
    at m.$digest (angular.js:18557)
    at m.$apply (angular.js:18945)
    at k (angular.js:12799)
    at V (angular.js:13056) "Possibly unhandled rejection: {}" 

Кажется, что первое значение HEX \x93 не декодируется.

Я использую kawanet / msgpack-lite во внешнем интерфейсе, поскольку обнаружил, что его можно использовать в браузере.

Пожалуйста, помогите!

1 Ответ

0 голосов
/ 20 октября 2018

В сообщении об ошибке сообщается, что вы отправили объект неправильного типа в метод decode().В документации по декодированию буфера показано, что поддерживаются только буферы, массивы и Uint8Array объекты.

Измените тип ответа на arraybuffer (по умолчанию text), а затем введитеданные ответа на msgpack.decode() в виде Uint8Array типизированного массива:

$http.get("/test", {responseType: "arraybuffer"}).then(function success(response) {
    var arr = new Uint8Array(response.data);
    console.log(arr);
    $scope.text = msgpack.decode(arr);
}, function error(response) {
    console.log(response);
});

Хотя в этом нет необходимости, вы хотите установить другой тип содержимого в своем ответе Flask.В настоящее время маршрут /test представляет контент как text/html, в то время как вы действительно должны пометить application/msgpack:

@app.route('/test')
def test():
    return msgpack.packb([1, 2, 3]), {'content-type': 'application/msgpack'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...