Окончательное решение после нескольких правок :
Я подозреваю, что ваша основная проблема связана с генератором случайных элементов массива. Вам нужно обернуть то, что у вас есть, с помощью Math.floor
, чтобы округлить, чтобы получить целое число:
sounds[Math.floor(Math.random() * sounds.length)]
Кроме того, Readstream.pipe
возвращает пункт назначения, поэтому то, что вы делаете, имеет смысл. Тем не менее, вы можете получить неожиданные результаты при вызове on('data')
на вашем читаемом после того, как вы уже с него по трубопроводу. node.js streams
docs упоминает об этом. Я проверил ваш код на моей локальной машине, и это, похоже, не проблема, но, возможно, имеет смысл изменить это, чтобы у вас не было проблем в будущем.
Выберите один стиль API
Интерфейс API для чтения потоков развивался в нескольких версиях Node.js и предоставляет несколько методов использования потоковых данных. Как правило, разработчики должны выбирать один из методов потребления данных и никогда не должны использовать несколько методов для получения данных из одного потока. В частности, использование комбинации итераторов on ('data'), on ('readable'), pipe () или async может привести к неинтуитивному поведению.
Вместо того, чтобы звонить on('data')
и res.write
, я бы просто снова направил трубку из readStream
в res
. Кроме того, если вы действительно не хотите получить длительность, я бы вытащил эту библиотеку и просто использовал событие readStream.end
, чтобы сделать дополнительные вызовы к put()
. Это работает, потому что вы передаете опцию false
при конвейере, которая отключает стандартную функциональность события end
в потоке записи и оставляет его открытым. Тем не менее, он по-прежнему испускается, поэтому вы можете использовать его в качестве маркера, чтобы узнать, когда читаемый закончил конвейер. Вот переработанный код:
const fs = require('fs');
const express = require('express');
const app = express();
const server = require('http').createServer(app)
//const getMP3Duration = require('get-mp3-duration') no longer needed
let sounds = ['61880.mp3', '62026.mp3', '62041.mp3', '62090.mp3', '62257.mp3', '60763.mp3']
app.get('/current', async (req, res) => {
let readStream = fs.createReadStream('sounds/61068.mp3')
let duration = await getMP3Duration(fs.readFileSync('sounds/61068.mp3'))
let pipe = readStream.pipe(res, {end: false})
function put(){
let file_path = 'sounds/'+sounds[Math.floor(Math.random() * sounds.length)]
readStream = fs.createReadStream(file_path)
// you may also be able to do readStream.pipe(res, {end: false})
readStream.pipe(pipe, {end: false})
console.log('Current Sound: ', file_path)
readStream.on('end', () => {
put()
});
}
readStream.on('end', () => {
put()
});
})
server.listen(3005, async function () {
console.log('Server is running on port 3005...')
});