除了检查Content-Type客户端请求的标头之外,我不知道检查 MIME 类型的更好和更聪明的方法。
您可以使用Transform 流实现上述解决方案。在此示例中,转换流缓冲了一些任意数量的数据,然后将其发送到您的 MIME 检查库。如果一切正常,它会重新发送数据。随后的块将按原样发出。
var stream = require('readable-stream');
var mmm = require('mmmagic');
var mimeChecker = new stream.Transform();
mimeChecker.data = [];
mimeChecker.mimeFound = false;
mimeChecker._transform = function (chunk, encoding, done) {
  var self = this;
  if (self.mimeFound) {
    self.push(chunk);
    return done();
  }
  self.data.push(chunk);
  if (self.data.length < 10) {
    return done();
  }
  else if (self.data.length === 10) {
    var buffered = Buffer.concat(this.data);
    new mmm.Magic(mmm.MAGIC_MIME_TYPE).detect(buffered, function(err, result) {
      if (err) return self.emit('error', err);
      if (result !== 'text/plain') return self.emit('error', new Error('Wrong MIME'));
      self.data.map(self.push.bind(self));
      self.mimeFound = true;
      return done();
    });
  }
};
然后,您可以将此转换流通过管道传输到任何其他流,例如请求流(顺便说一下,它完全支持 Node 0.10 流)。
// Usage example
var fs = require('fs');
fs.createReadStream('input.txt').pipe(mimeChecker).pipe(fs.createWriteStream('output.txt'));
编辑:为了更清楚地了解 Node 0.8 和 0.10 流之间遇到的不兼容性,当您定义流并将.on('data')侦听器附加到它时,它将切换到流模式(又名 0.8 流),这意味着它会发出数据,即使目的地没有在听。如果您向以下位置发起异步请求,可能会发生这种情况Magic.detect():数据仍然在流动,即使您在监听它。