Angular qz托盘sha-256未定义

Angular qz托盘sha-256未定义,angular,sha256,rsvp.js,qz-tray,Angular,Sha256,Rsvp.js,Qz Tray,我正在尝试使用Angular和Qz托盘打印简单的数据文本。但每次我尝试打印时,都会显示错误: qz-tray.js:35 ReferenceError: Sha256 is not defined at Object.hash (qz-tray.js:408) at WebSocket._qz.websocket.connection.sendData (qz-tray.js:184) at qz-tray.js:280 at j (rsvp.min.js:1) at new t (rsvp.m

我正在尝试使用Angular和Qz托盘打印简单的数据文本。但每次我尝试打印时,都会显示错误:

qz-tray.js:35 ReferenceError: Sha256 is not defined
at Object.hash (qz-tray.js:408)
at WebSocket._qz.websocket.connection.sendData (qz-tray.js:184)
at qz-tray.js:280
at j (rsvp.min.js:1)
at new t (rsvp.min.js:1)
at Object.promise (qz-tray.js:395)
at Object.dataPromise (qz-tray.js:272)
at Object.print (qz-tray.js:805)
at PrinterService.push../src/app/shared/services/print.service.ts.PrinterService.printData (print.service.ts:46)
at FoddListComponent.push../src/app/layout/foodlist/foddlist.component.ts.FoddListComponent.createPdf (foddlist.component.ts:122)
我已经在index.html中包含了所有3.js文件

这是我的index.html:

<head>
<meta charset="utf-8">
<title>ABC</title>
<base href="/">

<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">

<script src="https://cdn.jsdelivr.net/npm/rsvp@4/dist/rsvp.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/js-sha256/0.9.0/sha256.js"></script>
<script type="text/javascript" src="./qz-tray.js"></script>

基础知识

您可能忘记了导入:

import * as sha256 from 'js-sha256';
qz.api.setSha256Type(function(data) { return sha256(data); });

您可能忘记了导入:

import * as sha256 from 'js-sha256';
qz.api.setSha256Type(function(data) { return sha256(data); });

正如@Bart所指出的,这意味着您的导入缺少sha256。他提供了一个JavaScript(AngularJS)示例,因为您的问题标记中有
angular
,但是您的示例使用HTML标记。为完整起见,以下是HTML要求:

<!-- Required scripts -->
<script type="text/javascript" src="rsvp-3.1.0.min.js"></script>
<script type="text/javascript" src="sha-256.min.js"></script>
<script type="text/javascript" src="qz-tray.js"></script>
而且,如果在兼容浏览器上使用JavaScript运行HTTPS,则可以通过执行以下操作来避免SHA256:

qz.api.setPromiseType(function promise(resolver) { return new Promise(resolver); });
function sha256 (str) {
    // We transform the string into an arraybuffer.
    var buffer = new TextEncoder('utf-8').encode(str)
    return crypto.subtle.digest('SHA-256', buffer).then(function (hash) {
        return hex(hash)
    })
}

function hex (buffer) {
    var hexCodes = []
    var view = new DataView(buffer)
    for (var i = 0; i < view.byteLength; i += 4) {
        // Using getUint32 reduces the number of iterations needed (we process 4 bytes each time)
        var value = view.getUint32(i)
        // toString(16) will give the hex representation of the number without padding
        var stringValue = value.toString(16)
        // We use concatenation and slice for padding
        var padding = '00000000'
        var paddedValue = (padding + stringValue).slice(-padding.length)
        hexCodes.push(paddedValue)
    }

    // Join all the hex strings into one
    return hexCodes.join('')
}

qz.api.setSha256Type(function (data) {
    return sha256(data)
})

正如@Bart所指出的,这意味着您的导入缺少sha256。他提供了一个JavaScript(AngularJS)示例,因为您的问题标记中有
angular
,但是您的示例使用HTML标记。为完整起见,以下是HTML要求:

<!-- Required scripts -->
<script type="text/javascript" src="rsvp-3.1.0.min.js"></script>
<script type="text/javascript" src="sha-256.min.js"></script>
<script type="text/javascript" src="qz-tray.js"></script>
而且,如果在兼容浏览器上使用JavaScript运行HTTPS,则可以通过执行以下操作来避免SHA256:

qz.api.setPromiseType(function promise(resolver) { return new Promise(resolver); });
function sha256 (str) {
    // We transform the string into an arraybuffer.
    var buffer = new TextEncoder('utf-8').encode(str)
    return crypto.subtle.digest('SHA-256', buffer).then(function (hash) {
        return hex(hash)
    })
}

function hex (buffer) {
    var hexCodes = []
    var view = new DataView(buffer)
    for (var i = 0; i < view.byteLength; i += 4) {
        // Using getUint32 reduces the number of iterations needed (we process 4 bytes each time)
        var value = view.getUint32(i)
        // toString(16) will give the hex representation of the number without padding
        var stringValue = value.toString(16)
        // We use concatenation and slice for padding
        var padding = '00000000'
        var paddedValue = (padding + stringValue).slice(-padding.length)
        hexCodes.push(paddedValue)
    }

    // Join all the hex strings into one
    return hexCodes.join('')
}

qz.api.setSha256Type(function (data) {
    return sha256(data)
})

我也有类似的问题。通过按要求导入sha56模块解决此问题。这是代码。如果您面临任何问题,请尝试一次让我知道

declare var require: any;
import { Injectable } from '@angular/core';
import * as qz from 'qz-tray';
var sha1= require('js-sha256');

qz.api.setSha256Type(function (data) {
  var hashed = sha1(data);
  return hashed;
});

我也有类似的问题。通过按要求导入sha56模块解决此问题。这是代码。如果您面临任何问题,请尝试一次让我知道

declare var require: any;
import { Injectable } from '@angular/core';
import * as qz from 'qz-tray';
var sha1= require('js-sha256');

qz.api.setSha256Type(function (data) {
  var hashed = sha1(data);
  return hashed;
});