Я занимаюсь разработкой службы генератора изображений, которая позволит пользователям создавать изображения с эффектами и наложениями. Я пытаюсь создать Triggered Endpoint, который использует Canvas и GIFEncoder.
К сожалению, я получаю ошибку stream.on is not a function
. У меня есть команда Triggered на моем Discord Bot, которая использует Canvas и GIFEncoder, и она отлично работает. Очевидно, это другой процесс на моем боте, но с использованием Express. Я не очень знаком с ним.
Вот индекс. js файл
const express = require('express');
const app = express();
const TriggeredEndpoint = require("./backend/generate/triggered")
function status(type, msg, res) {
if (type === false) res.status(400);
return res.json({sucess: type, message: msg});
}
function streamStatus(type, stream, res) {
if (type === false) res.status(400);
let data;
stream.on("data", (b) => {
res.write(b);
});
stream.on("end", () => {
res.end();
});
};
function isImage(link) {
let type = link.substring(link.lastIndexOf('.') + 1);
let isPNG = /(png)/gi.test(type); //eslint-disable-line
if (!isPNG) return false;
return true;
}
app.get('/api/triggered', async (req, res) => {
if (!req.query.url) return status(false, 'No URL Provided', res);
let check = await isImage(req.query.url);
if (!check) return status(false, 'The Image Isnt Of The PNG Type.', res);
let result = await TriggeredEndpoint(req.query.url);
return streamStatus(result[0], result[1], res);
});
запущен. js файл
const { createCanvas, Image, loadImage, registerFont } = require("canvas");
const request = require('node-superfetch');
const GIFEncoder = require('gifencoder');
const { get } = require('node-superfetch');
module.exports = async function TriggeredEndpoint(image) {
function streamToArray(stream) {
if (!stream.readable) return Promise.resolve([]);
return new Promise((resolve, reject) => {
const array = [];
function onData(data) {
array.push(data);
}
function onEnd(error) {
if (error) reject(error);
else resolve(array);
cleanup();
}
function onClose() {
resolve(array);
cleanup();
}
function cleanup() {
stream.removeListener('data', onData);
stream.removeListener('end', onEnd);
stream.removeListener('error', onEnd);
stream.removeListener('close', onClose);
}
stream.on('data', onData);
stream.on('end', onEnd);
stream.on('error', onEnd);
stream.on('close', onClose);
});
}
const encoder = new GIFEncoder(256, 256);
const canvas = new createCanvas(256, 256);
const ctx = canvas.getContext('2d');
const imgTitle = new Image();
const imgTriggered = new Image();
imgTitle.src = await get('https://i.imgur.com/HQJ09eD.png').then(x => x.body);
imgTriggered.src = image
const stream = encoder.createReadStream();
encoder.start();
encoder.setRepeat(0);
encoder.setDelay(50);
encoder.setQuality(200);
const coord1 = [-25, -33, -42, -14];
const coord2 = [-25, -13, -34, -10];
for (let i = 0; i < 4; i++) {
ctx.drawImage(imgTriggered, coord1[i], coord2[i], 300, 300);
ctx.fillStyle = 'rgba(255 , 100, 0, 0.4)';
ctx.drawImage(imgTitle, 0, 218, 256, 38);
ctx.fillRect(0, 0, 256, 256);
encoder.addFrame(ctx);
}
encoder.finish();
const resimage = streamToArray(stream).then(Buffer.concat);
return [
true,
resimage
];
}
Сработал. js код аналогичен коду моей команды Discord Bot Triggered, он работает нормально, просто я не могу заставить его работать над моим проектом Image Gen API.
Если я помогу, я был бы признателен .