NodeError: писать после конца в NodeJS

Я начинаю изучать NodeJS и начал создавать небольшое приложение, которое шифрует и расшифровывает файл по запросу пользователя. Приведенный ниже код отлично работает при первом запросе шифрования, но дает сбой при другом.

App.js

var fs = require('fs')
var crypto = require('crypto')
const express = require('express')
const app = express()
const port = 3000
var key = '1bd';
var cipher = crypto.createCipher('aes-256-cbc', key);
var decipher = crypto.createDecipher('aes-256-cbc', key);


app.use(express.static('public'))


app.get('/', (req, res) => {
    res.sendFile('/enc-dec.html', { root: __dirname })
})

app.post('/encrypt', (req, res) => {
    fs.createReadStream('input.txt')
    .pipe(cipher)
    .pipe(fs.createWriteStream('input.txt.enc'))
    .on('finish', function() {
        res.end("Encrypted")
    });
})

app.listen(port, () => console.info(`App listening on port ${port}!`))

Ошибка:

NodeError: write after end
    at writeAfterEnd (_stream_writable.js:237:12)
    at Cipher.Writable.write (_stream_writable.js:287:5)
    at ReadStream.ondata (_stream_readable.js:646:20)
    at ReadStream.emit (events.js:180:13)
    at addChunk (_stream_readable.js:269:12)
    at readableAddChunk (_stream_readable.js:256:11)
    at ReadStream.Readable.push (_stream_readable.js:213:10)
    at fs.read (fs.js:2123:12)
    at FSReqWrap.wrapper [as oncomplete] (fs.js:680:17)
Emitted 'error' event at:
    at Cipher.onerror (_stream_readable.js:670:12)
    at Cipher.emit (events.js:180:13)
    at writeAfterEnd (_stream_writable.js:239:10)
    at Cipher.Writable.write (_stream_writable.js:287:5)
    [... lines matching original stack trace ...]
    at fs.read (fs.js:2123:12)

Я не эксперт в этом, но, похоже, проблема с фс. Любая помощь будет принята с благодарностью. Спасибо!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
1 402
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема в том, что вы многократно используете один и тот же шифр. После однократного использования в потоке его нельзя использовать повторно; должен быть создан новый.

Вы должны создать свой шифр в обработчике запросов, например:

app.post('/encrypt', (req, res) => {
    var cipher = crypto.createCipher('aes-256-cbc', key);
    fs.createReadStream('input.txt')
    .pipe(cipher)
    .pipe(fs.createWriteStream('input.txt.enc'))
    .on('finish', function() {
        res.end("Encrypted")
    });
})

Не похоже, что у вас есть функция дешифрования, но когда вы ее создадите, вам также нужно будет переместить var decipher = crypto.createDecipher('aes-256-cbc', key); в обработчик запросов, потому что дешифровки также нельзя использовать повторно.

Другие вопросы по теме