Я начинаю изучать 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)
Я не эксперт в этом, но, похоже, проблема с фс. Любая помощь будет принята с благодарностью. Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваша проблема в том, что вы многократно используете один и тот же шифр. После однократного использования в потоке его нельзя использовать повторно; должен быть создан новый.
Вы должны создать свой шифр в обработчике запросов, например:
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); в обработчик запросов, потому что дешифровки также нельзя использовать повторно.