2017-04-12 1 views
0

Ich lerne nodejs (und ich mag es!). Ich habe versucht herauszufinden, wie man einen kürzeren Alias ​​für console.log hat und ich fand heraus, dass ich var cout=console.log verwenden und von jetzt an cout('[string]') verwenden kann. Dann, als ich process.stdout.write verwenden wollte und ich versuchte, einen kurzen Alias ​​dafür zu machen, var out=process.stdout.write verwendend. Aber wenn ich out('[string]') verwenden, erhalte ich folgende Fehlermeldung:nodejs: shore alias für process.stdout.write

_stream_writable.js:220   var state = this._writableState;                   ^   TypeError: Cannot read property '_writableState' of undefined

    at Writable.write (_stream_writable.js:220:19)     at Socket.write (net.js:670:40)     at Object. (/home/shayan/Desktop/nodejs/server.js:12:1)

    at Module._compile (module.js:571:32)

    at Object.Module._extensions..js (module.js:580:10)     at Module.load (module.js:488:32)     at tryModuleLoad (module.js:447:12)     at Function.Module._load (module.js:439:3)     at Module.runMain (module.js:605:10)     at run (bootstrap_node.js:423:7)

Was ist hier falsch? Wie kann ich einen kurzen Alias ​​für process.stdout.write korrekt erstellen? Danke

Antwort

0

Sie sollten diese Art von "kurzen Alias" nicht tun. Es ist sehr unordentlich und Leute, die Ihren Code lesen, werden nicht verstehen, warum Sie zufällige Funktionsnamen anstelle von console.log verwenden. Wenn Sie jedoch wirklich Funktion Aliase erstellen möchten, sollten Sie eine function mit:

function out(text) { 
    //  ^ ^- argument accepted by the function 
    // |------ the function name 
    process.stdout.write(text) 
    //      ^- pass the argument you accepted in your new function to the long function 
} 

ich eine Erklärung für den Fall hinzugefügt Sie nicht wissen, wie eine Funktion funktioniert, können Sie sicher entfernen.

Bearbeiten: Der Grund, warum es nicht funktioniert, ist im Quellcode von Node.JS. Die Stacktrace, Sie werden immer wieder Punkte zu this Linie:

Writable.prototype.write = function(chunk, encoding, cb) { 
    var state = this._writableState; 
    // ... 
} 

Es wird versucht, eine Variable _writableState von this genannt zu verweisen. Wie geschrieben here:

Inside a function, the value of this depends on how the function is called.

Das bedeutet, dass this zu process.stdout bezieht, wenn Sie process.stdout.write nennen, aber es ist nicht definiert, wenn Sie es von Ihrem Alias ​​nennen. Daher erhalten Sie eine Cannot read property '_writableState' of undefined Ausnahme (wie undefined enthält diese Variable nicht, die für die write-Funktion wichtig ist, um auszuführen).

+0

Guter Punkt, danke – Credo

+0

Betrachten Sie diese Antwort, wenn es für Sie funktioniert, oder fragen Sie, ob es nicht funktioniert :) – Benni

+0

Nun, ich hatte gehofft, ich könnte einen Einblick gewinnen, warum die Methode, die ich erklärte, für die Konsole funktioniert. log und nicht für process.stdout.write. Auch bedeutet die Tatsache, dass Sie eine Funktion vorgeschlagen haben, dass es keine Möglichkeit gibt, process.stdout.write einen kurzen Alias ​​zu geben? Das ist seltsam! Aber wie Sie gesagt haben, schlägt Codelesbarkeit stark vor, diese Methoden sowieso nicht zu verwenden. Und ich habe deine Antwort aufgewertet, aber weil ich neu bin, sind meine Stimmen nicht sichtbar! – Credo