2016-10-01 3 views
0

Also im Grunde habe ich einen Ordner, der andere Ordner enthält und jeder Ordner hat seinen eigenen Satz von Bildern, die ich in einem 'ul' anzeigen möchte. Das Problem ist, da ich readdir verwende, was async ist, wie kann ich die response schreiben, ohne eine "Schreiben Sie nach .end() Fehler". So sieht mein Code aus.Lesen von Dateien aus Ordnern in einem Ordner

var fs = require('fs'), 
    url = require('url'); 

module.exports = function(req, res) { 
    req.pathName = req.pathName || url.parse(req.url).pathname; 

    if(req.pathName === '/gallery') { 
     fs.readdir('./content/images/public', function(err, filenames) { 
      if (err) { 
       console.log(err); 
       return; 
      } 

      if(filenames.length) { 
       var list_content = ''; 

       for (var i = 0; i < filenames.length; i++) { 
        fs.readdir('./content/images/public/' + filenames[i], function(err, images) { 
         if (err) { 
          console.log(err); 
          return; 
         } 

         for (var i = 0; i < images.length; i++) { 
          list_content += '<li><a href="/gallery/details/'+ i +'">' + images[i] + '</a></li>'; 
         } 

         var list = '<ul>' + list_content + '</ul><a href="/">Go back to homepage</a>'; 

         res.writeHead(200, { 
          'Content-Type': 'text/html' 
         }); 
         res.send(list); 
        }); 
       } 
      } else { 
       res.writeHead(200, { 
        'Content-Type': 'text/html' 
       }); 
       res.write('<p>There are no images in the gallery</p><a href="/">Go back to homepage</a>'); 
       res.end(); 
      } 
     }); 
    } else { 
     return true; 
    } 
} 
        res.end(); 
       } 
      }); 

Antwort

0

Statt mit res.write() und res.end(), versuchen res.send mit(), die für Sie beide tut. UPDATE: Stellen Sie außerdem sicher, dass sich dieser Code in einem Anforderungsrückruf befindet, an dem req und res-Objekt korrekt analysiert werden.

for (var i = 0; i < images.length; i++) { 
    list_content += '<li><a href="/gallery/details/'+ i +'">' + images[i] + '</a></li>'; 
    } 

    var list = '<ul>' + list_content + '</ul><a href="/">Go back to homepage</a>'; 

res.send(list); 

dann am vorderen Ende, erhalten sie in der Ajax-Antwort Rückruf, wie

$.post('xxxx', function(response){ 
     alert(response); //list 
}); 

UPDATE: nach dem aktualisierten Code zu sehen,

module.exports = function(req, res) { 

tut Sinn machen, es braucht so etwas wie

exports.functionName = function(req,res){ 

Lesen Sie dieses

https://www.sitepoint.com/understanding-module-exports-exports-node-js/

module.exports ist ein Objekt von Funktionen. Keine Funktion. Es sieht so aus

module.exports = { 
    funcExample: function() { 
    return 2; 
    }, 

    funcOtherExample: function() { 
    return 1; 
    } 
+0

Ich bekomme einen Fehler, der sagt "res.send()" ist keine Funktion –

+0

Ok. Das muss sein, weil Sie diese Async-Funktion nicht innerhalb einer Route aufrufen? Wo wenn deine Funktion (req, res)? Bitte zeige mehr von deinem Umgebungscode und sieh es dir an. –

+0

Ich habe meine Frage bearbeitet, indem ich den ganzen Code in meine .js Datei platzierte –

Verwandte Themen