qz-tray sha-256 не определено
Я пытаюсь напечатать простой текст данных, используя Angular и Qz-Tray. Но каждый раз, когда я пытаюсь напечатать, отображается ошибка:
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)
Я включил все 3 .js файлы в index.html
Вот мой 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>
3 ответа
Вы, вероятно, забыли импорт:
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>
Кроме того, вы можете избежать RSVP, выполнив следующие действия:
qz.api.setPromiseType(function promise(resolver) { return new Promise(resolver); });
И, если работает HTTPS с JavaScript, работающим в совместимом браузере, вы можете избежать SHA256, выполнив следующие действия:
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)
})
... но большинство людей в порядке с фрагментом кода @ Барта. Вот полный фрагмент из вики QZ Tray, раздел AngularJS:
import * as qz from 'qz-tray';
import * as sha256 from 'js-sha256';
qz.api.setSha256Type(function(data) { return sha256(data); });
qz.api.setPromiseType(function promise(resolver) { return new Promise(resolver); });
qz.websocket.connect()
.then(qz.printers.getDefault)
.then(function(printer) {
console.log("The default printer is: " + printer);
})
.then(qz.websocket.disconnect)
.catch(function(err) {
console.error(err);
});
У меня есть похожая проблема. Решите это, импортировав модуль 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;
});