Warum erhalte ich einen Segmentation fault Node.js?
Habe ich diese Funktion hier:
function createInsta(email, userid) {
if (!fs.existsSync('users/' + email + '/' + userid)) {
fs.mkdir('users/' + email + '/' + userid)
fs.writeFileSync(('users/' + email + '/' + userid + '/instagram.json'), fs.readFileSync("data/data.json", "utf-8"))
console.log("insta folder created");
}
console.log("Initializing Data")
var data = fs.readFileSync('users/' + email + '/' + userid + '/instagram.json', "utf-8")
data = JSON.parse(data);
var result;
request(("https://instagram.com/" + userid + "/?__a=1"), function(error, response, body) {
var res = JSON.parse(body);
result = res.user.followed_by.count
if (error) {
console.log(err)
}
})
while (result === undefined) {
deasync.sleep(100)
}
data.STARTING_COUNTS[0].DAY = result;
data.STARTING_COUNTS[0].WEEK = result;
data.STARTING_COUNTS[0].MONTH = result;
}
Recht, nachdem die Konsole druckt outs Initializing Data
, die Konsole sagt Segmentation fault
Ich habe keine Ahnung, warum das so ist, mein code scheint nicht, wie alles könnte dazu führen, dass solche ein Fehler.
Irgendwelche Hinweise? Dank
- "Irgendwelche Hinweise" - Wortspiel?
- Ich weiß nicht, wie die Aussehen ->
while (result === undefined) {deasync.sleep(100) }
Und warum ist Sie nötig? - Ich habe es als einfaches und schnelles hack um das asynchrone Modell von nodejs für diese Funktion, Ive verwendet es in anderen Funktionen kein problem, ich bezweifle, dass Ihr die Ursache für den segmentation Fault
- Nicht wenn ich zuerst dieses geschrieben, aber das ist ziemlich witzig haha
- Ich würde sagen, es ist der wahrscheinlichste Kandidat für die seg-fault. github.com/abbr/deasync/issues/48 In der Theorie, es sollte unmöglich sein, um einen seg fault mit node.js in reiner form, als javascript innerhalb einer sandbox, aber Ihre deasync ist eine c++ - hack, dass kann sicherlich seg fault. Node.Js ist von Grund auf konzipiert werden, async, versucht zu zwingen, in der sync-Modus ist nur ärger,..
- Okay, ich werde schauen, in das versuchen, zu machen es zu arbeiten, ohne deasync, danke
- Kein problem, Sie brauchen jede Hilfe, die Umgestaltung zu werden, async, Fragen Sie sich. Ich kam aus Delphi, C# und immer meinen Kopf um die asynchrone Natur von javascript hat einige Zeit gedauert. Aber es zahlt sich aus am Ende, mit Versprechungen kann sicherlich helfen. Und neue features wie erwarten, sind die Dinge noch einfacher.
- Lassen Sie uns weiter, diese Diskussion im chat.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie versprochen (verzeihen Sie das Wortspiel), hier ist der Einstieg in den Umbau, den code in Versprechen /erwarten.
Dies ist eine Art beginnen, Ihren code zu verwenden, der verspricht, es ist mehr Fehlerprüfung benötigt usw, aber das habe ich bewusst gemacht, wie wenig Sie den code für die jetzt zu zeigen die Veränderungen, und wir können das umgestalten, wie wir gehen auf.
zB. alle, die fs.existsSync etc, soll ' s machen verspricht, so können wir loszuwerden, alle sync Sachen. Ihre node.js App wird Sie dafür lieben.
Später, können wir mehr tun. Versprechen integrierten in-browser/Knoten sind in Ordnung, aber ich finde auch, ein Versprechen lib können Dinge viel einfacher machen, würde ich vorschlagen, bluebird -> http://bluebirdjs.com/docs/getting-started.html Es sich lohnen könnte, mit einem guten Lesen gibt es auch, bluebird hat einige nützliche Hilfsfunktionen wie promisify, dass Ihre fs.func ist einfacher.
So, ich denke, das sollte jetzt tun, und wir tun ein weiteres umgestalten später.
JS:
fs.mkdir
sollte, dass entwederfs.mkdirSync
oder ein callback übergeben werden sollen.Ok, wir überarbeiten unseren letzten post.
Gab es nur einen Grund verwenden wir die
new Promise()
Konstruktor, und das war, weil die Anforderung Async. In der Tat machte ich einen leichten Fehler wirklich so einige Fehler nicht behandelt werden, in der richtigen Art und Weise. Was soll ich getan haben, ist bewegen Sie dennew Promise()
bis kurz vor der Anfrage.Nun eine große Sache über Verspricht ist, der Fehler ist verbreitet unten in der Kette, in unserem Beispiel also so weit, wir haben eine Konsole.log() in unserem Anfrage-Objekt. Was wäre schön ist, dass alle un-behandelten Fehler und Ihre Behandlung in einem Ort. In diesem Beispiel wird die Funktion run() scheint ein schöner Ort.
Wenn Sie nun einen Blick auf Ihre createInsta Funktion würden Sie denken, es ist mit alle sync-Funktion, aber in der Tat, abgesehen von existsSync alles andere ist async. Wie bereits erwähnt, in den Kommentaren, existSync wirklich will, das entfernen sowieso. Stattdessen nur das Verzeichnis zu erstellen und fangen Sie die Fehler in einem try-catch-oder noch besser eine utility-Funktion sagen, genannt tryMkDir, dass diese (Versprechen basiert natürlich).. 🙂
Eine Letzte Anmerkung, await /async ist eine ziemlich neue javascript, ich denke, es ist ES7, und ich glaube nicht, es ist aber noch nicht abgeschlossen. Aber Sie können es verwenden, nun, mit so etwas wie Babel.
JS: