2014-05-21 1 views
4

Je suppose que cela vient d'une compréhension limitée des flux, mais j'ai regardé partout et je ne peux pas le faire fonctionner. En bref, je veux prendre un flux Gulp et passer le contenu concaténé du flux à une réponse express directement sans écrit dans le système de fichiers.Tuyau concaténé Gulp stream file.contents au serveur (connect, express ou http)

Voilà comment j'ai eu l'idée (qui fonctionne très bien):

app.get('*', function(req, res){ 
    var stream = fs.createReadStream(__dirname + '/app/index.html'); 
    stream.pipe(res); 
}); 

Mais je veux appliquer le même concept en utilisant un flux de Gulp:

app.get('/app/js/concatenated-js-files.js', function(req, res){ 
    gulp.src('app/js/**/*.js') 
     .pipe(concat()) 
     .pipe(res); 
}); 
app.listen(5555, function() { 
    console.log('Listening on port 5555'); 
}); 

Ce qui ne fonctionne pas et les rendements les éléments suivants lors de la demande /app/js/concatenated-js-files.js du navigateur:

[gulp] Error in plugin 'gulp-concat': Missing fileName option for gulp-concat 
    at module.exports (/Users/lgomez/Projects/index-packager/node_modules/gulp-concat/index.js:10:24) 
    at Object.handle (/Users/lgomez/Projects/index-packager/index.js:83:15) 
    at next_layer (/Users/lgomez/Projects/index-packager/node_modules/express/lib/router/route.js:103:13) 
    at Route.dispatch (/Users/lgomez/Projects/index-packager/node_modules/express/lib/router/route.js:107:5) 
    at /Users/lgomez/Projects/index-packager/node_modules/express/lib/router/index.js:213:24 
    at Function.proto.process_params (/Users/lgomez/Projects/index-packager/node_modules/express/lib/router/index.js:284:12) 
    at next (/Users/lgomez/Projects/index-packager/node_modules/express/lib/router/index.js:207:19) 
    at Layer.expressInit [as handle] (/Users/lgomez/Projects/index-packager/node_modules/express/lib/middleware/init.js:23:5) 
    at trim_prefix (/Users/lgomez/Projects/index-packager/node_modules/express/lib/router/index.js:255:15) 
    at /Users/lgomez/Projects/index-packager/node_modules/express/lib/router/index.js:216:9 

Cette erreur est ExPEC ted. gulp-concat a été écrit pour la sortie dans le fichier.

Je voudrais éviter d'écrire un plugin de gulp qui serait très similaire à gulp-concat. Je peux fourchonner et suggérer mais, pour l'instant, y at-il un autre moyen d'y parvenir?

Merci!

Voici le code complet si vous souhaitez l'essayer.

var express = require('express'); 
var gulp = require('gulp'); 
var concat = require('gulp-concat'); 
var app  = express(); 
app.get('/app/js/concatenated-js-files.js', function(req, res){ 
    gulp.src('app/js/**/*.js') 
     .pipe(concat()) 
     .pipe(res); 
}); 
app.listen(5555, function() { 
    console.log('Listening on port 5555'); 
}); 
// http://localhost:5555/app/js/concatenated-js-files.js 
+0

** Remarque: ** J'ai essayé [event-stream] (https://github.com/dominictarr/event-stream), [bufferstreams] (https://github.com/nfroidure/BufferStreams) et [kat] (https://github.com/fent/node-kat) mais pas de chance. – luisgo

Répondre

5

gulp travaux sur les flux d'objets de fichiers virtuels, pas des fichiers physiques. En tant que tel, gulp-concat n'écrit pas dans le système de fichiers, peu importe le nom que vous lui donnez. Toutefois, vous aurez toujours un problème car vous ne pouvez pas envoyer ces objets directement à la réponse res.

Vous devez écrire le contenu du fichier virtuel res. Un moyen facile de le faire est d'utiliser through pour créer un flux qui lit l'entrée de gulp et écrit le contenu des fichiers à res. Si votre flux gère plusieurs fichiers, vous n'avez pas besoin de concat.

var through = require('through'); 

// create a stream that reads gulp File objects and outputs their contents 
function sendTo(res) { 
    return through(
     function write(data) { // this will be called once for each file 
      res.write(data.contents); 
     }, 
     function end() { // this will be called when there are no more files 
      res.end() 
     } 
    ); 
} 

app.get('/app/js/concatenated-js-files.js', function(req, res){ 
    gulp.src('app/js/**/*.js') 
     .pipe(sendTo(res)); 
}); 

En outre, gulp utilise en interne vinyl-fs pour lire les fichiers, vous pouvez utiliser vinyle fs directement si aucun autre besoin que de gulp.

+1

Merci beaucoup. Cela fait partie de moi d'apprendre à travailler avec les flux, donc ça ne me dérangerait pas de ne pas utiliser le gulp, mais la façon dont il sélectionne les fichiers en utilisant la minimap et en permettant un choix de sélecteurs minimap est très pratique. AFAIK Glob ne me laisse pas faire ça. Mais merci! c'est bien. – luisgo

+0

juste ce que le médecin a appelé, merci! –

Questions connexes