2017-08-28 4 views
0
var http = require('http'); 
var fs = require('fs'); 
var path=""; 
process.stdin.on('data', function(chunk) { 
    var buffer = new Buffer(chunk); 
    path = buffer.toString(); 
}); 
function onRequest(request, response) { 
    console.log("Request received" + path); 
    fs.readdir(path, function(err, items) { 
    response.writeHead(200, {"Content-Type": "text/plain"}); 
    response.write(JSON.stringify(items)); 
    response.end(); 
}); 
} 
http.createServer(onRequest).listen(8000); 

Elemente werden undefiniert zurückgegeben. Irgendwelche Vorschläge warum?Eingabe kann nicht mit stdin gelesen werden

Vielen Dank im Voraus

+0

Mit diesem Code mit einem Schnelltest, um Elemente für mich nicht spezifiziert (ich eine Liste von Dateien zu erhalten wie beabsichtigt). Kannst du versuchen, 'err' in' fs.readdir' zu loggen und zu sehen, ob dort etwas schief läuft? – MrTeddy

+0

@MrTeddy Warum geben Sie uns nicht den Test und/oder geben Sie es als Antwort? –

+0

Auch ist 'http' wirklich der Weg zu gehen, nur' stdin' zu lesen? Ich bin vielleicht verwirrt darüber, wie Sie tatsächlich mit dieser Software interagieren wollen. –

Antwort

2

Wenn Sie geben eine Zeichenfolge stdin\n am Ende zusammen mit der Zeichenfolge setzt. Verwenden Sie den folgenden Code, um dies zu lösen:

var http = require('http'); 
var fs = require('fs'); 
var path=""; 
process.stdin.on('data', function(chunk) {  
    var buffer = new Buffer(chunk); 
    path = buffer.toString();  
    path = path.replace("\n",""); 
    path = path.replace("\r",""); 
}); 
function onRequest(request, response) { 
    console.log("Request received", path);  
    fs.readdir(path, function(err, items) { 
     const opts = {"Content-Type": "text/plain"}; 
     if(err) { 
      console.log(err); 
      response.writeHead(404, opts); 
      response.write("path not found"); 
     } else { 
      response.writeHead(200, opts); 
      response.write(JSON.stringify(items)); 
     } 
     response.end(); 
    }); 
} 
http.createServer(onRequest).listen(8000); 
+0

Wirft Fehler: Fehler: ENOENT: keine solche Datei oder das Verzeichnis, scandir ‚C: \ Benutzer \ Narendranath \ Desktop \ Ass-Knoten bei Error (nativ) errno: -4058, Code: 'ENOENT', syscall: 'scandir', Pfad: 'C: \\ Benutzer \\ Narendranath \\ Desktop \\ Ass-Node \' –

+0

Überprüfen Sie die Bearbeitung @AKSHARAT –

1

Vergessen Sie nicht auch, dass stdin zeilenorientiert sein kann (ein \n am Ende brauchen, die dann brauchen Abstreifen wird) mit einem interaktiven TTY, aber nicht sein kann, mit einem nicht-interaktiven wie dem Test erwarte ich @MrTeddy gemacht.

Edit: ein nicht-interaktives Beispiel:

const { execFile } = require('child_process'); 

// Execute the stdin.js test file 
const child = execFile('node', ['stdin']); 

child.stdout.on('data', (data) => { 
    console.log(data); 
}); 

// Send the path 
child.stdin.end("./"); 

stdin.js

var http = require('http'); 
var fs = require('fs'); 

var path = ""; 

process.stdin.on('data', function (chunk) { 
    var buffer = new Buffer(chunk); 
    path = buffer.toString(); 
}); 

function onRequest(request, response) { 
    console.log("Request received" + path); 
    fs.readdir(path, function (err, items) { 
     if (err) return console.log(err); 
     response.writeHead(200, { 
      "Context-Type": "text/plain" 
     }); 
     response.write(JSON.stringify(items)); 
     response.end(); 
    }); 
} 
http.createServer(onRequest).listen(8000); 
+1

Ja, ich habe auch eine nicht interaktive verwendet. Ich war mir nicht sicher, wie das OP interagierte, dachte auch nicht daran. Als Referenz war dies der Test https://pastebin.com/eY2mWtau – MrTeddy

+0

Bitte bearbeiten Sie meine Antwort, um Ihren Testtext hinzuzufügen. Lassen Sie uns nicht Leute Links zu anderen Seiten folgen, die Ihre Arbeit löschen könnten! –

Verwandte Themen