【问题标题】:How to handle multiple requests to a file in node.js server如何处理对 node.js 服务器中文件的多个请求
【发布时间】:2017-11-07 19:51:11
【问题描述】:

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

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');
})

【问题讨论】:

    标签: javascript node.js express server


    【解决方案1】:

    您正在使用fs.statSync(),这将阻止线程同时侦听传入连接。相反,您应该切换到异步版本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)
        })
    })
    

    【讨论】:

      【解决方案2】:

      你已经在用express了,不用重新发明轮子http://expressjs.com/en/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
          });
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多