如何处理node.js服务器中对文件的多个请求

我正在尝试在node.js服务器中提供多个audio文件,但是当多个客户端尝试访问时,服务器有时会失败。 我该如何补救?

express = require('express'); const http = require('http'); const path = require('path'); const fs = require('fs'); const app = express(); app.get('/', function (request, response) { let fpath = base_dir + filenames[getIndex(filenames.length)]; let filestream = fs.createReadStream(fpath); var d = new Date(); filestream.on('open', function() { let stats = fs.statSync(fpath); let fileSizeInBytes = stats["size"]; response.writeHead(200, { "Accept-Ranges": "bytes", 'Content-Type': 'audio/mpeg', 'Content-Length': fileSizeInBytes}); filestream.pipe(response); }); }) app.listen(3000, function () { console.log('Audio file provider listening on port 3000'); }) 

您正在使用fs.statSync() ,它将阻止线程也监听传入的连接。 相反,你应该切换到asynchronous版本fs.stat()

 app.get('/', (req, res) => { let fpath = base_dir + filenames[getIndex(filenames.length)] let d = new Date() fs.stat(fpath, (err, stats) => { // Handle Error when trying to get file stats // Respond with 500 Internal Server Error if (err) { console.log(err) return res.sendStatus(500) } let {size} = stats res.status(200) res.setHeader('Accept-Ranges', 'bytes') res.setHeader('Content-Type', 'audio/mpeg') res.setHeader('Content-Length', size) fs.createReadStream(fpath).pipe(res) }) }) 

您已经使用快递,无需重新发明轮子http://expressjs.com/zh/4x/api.html#res.sendFile

 app.get('/', function (request, response) { let fpath = base_dir + filenames[getIndex(filenames.length)]; response.sendFile(fpath, function(err) { //Handle err if any }); })