Ich bin es gewohnt, in Java zu denken, und ich versuche, mich um node.js. Mein Programm muss Informationen protokollieren, wenn etwas schief geht, und ich muss feststellen, dass ich eine Menge Code in mein node.js-Programm eingeben muss, um zu bekommen, was ich kostenlos in Java bekommen würde."Call-Stack" für Rückrufe in node.js
Meine Frage läuft darauf hinaus:
- ist es eine einfachere/Nicht-Text Weise stapelt artige Informationen in einer Kette von Rückrufen zu bekommen? und/oder
- bin ich schuldig, node.js nicht richtig verstanden zu haben und zu versuchen, asynchrone node.js zu zwingen, synchronen Java ähnlicher zu sein?
Java Beispiel
Hier ist ein noddy Java-Programm, das versucht (und nicht) zu einer Mongo Datenbank zu verbinden: Import java.net.UnknownHostException;
import com.mongodb.Mongo;
public class Test {
public static void main(final String[] args) throws UnknownHostException {
final Mongo mongo = a();
}
private static Mongo a() throws UnknownHostException {
return b();
}
private static Mongo b() throws UnknownHostException {
return c();
}
private static Mongo c() throws UnknownHostException {
return new Mongo("non-existent host");
}
}
..., die diese Informationen hilfreich Stapel-Ausgang gibt:
Exception in thread "main" java.net.UnknownHostException: non-existent host
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$1.lookupAllHostAddr(Unknown Source)
at java.net.InetAddress.getAddressesFromNameService(Unknown Source)
at java.net.InetAddress.getAllByName0(Unknown Source)
at java.net.InetAddress.getAllByName(Unknown Source)
at java.net.InetAddress.getAllByName(Unknown Source)
at java.net.InetAddress.getByName(Unknown Source)
at com.mongodb.ServerAddress.updateInetAddress(ServerAddress.java:204)
at com.mongodb.ServerAddress.<init>(ServerAddress.java:73)
at com.mongodb.ServerAddress.<init>(ServerAddress.java:46)
at com.mongodb.Mongo.<init>(Mongo.java:138)
at Test.c(Test.java:20)
at Test.b(Test.java:16)
at Test.a(Test.java:12)
at Test.main(Test.java:8)
(Insbesondere die letzten 4 Zeilen zeigen Sie mir zu der Zeit in meinem eigenen Code "was los war" der Mongo Fehler aufgetreten .)
Node.js Beispiel
Hier ist mein Versuch, mein Programm in node.js neu schreiben:
a(function (err, mongo) {
if (err) {
console.log("Something went wrong in main");
console.log(err);
}
});
function a(callback) {
b(function (err, mongo) {
if (err) {
console.log("Something went wrong in a()");
return callback(err);
}
return callback(null, mongo);
});
}
function b(callback) {
c(function (err, mongo) {
if (err) {
console.log("Something went wrong in b()");
return callback(err);
}
return callback(null, mongo);
});
}
function c(callback) {
var MongoClient = require('mongodb').MongoClient;
return MongoClient.connect('mongodb://non-existent host/', function (err, mongo) {
if (err) {
console.log("Something went wrong in c()");
return callback(err);
}
return callback(null, mongo);
});
}
..., die diesen Ausgang gibt:
Something went wrong in c()
Something went wrong in b()
Something went wrong in a()
Something went wrong in main
[Error: failed to connect to [non-existent host:27017]]
Aber diese Ausgabe zu erhalten, habe ich in meinem Programm in vielen Standardcode setzen, die ein Schmerz Polizei als mein Programm sein wird wird größer und ich habe ein ganzes Entwicklungsteam.
Kann ich diese stack-artige Ausgabe auf andere Weise erhalten? Ist es unknotenartig, diese Art von Ausgabe zu erwarten?
Versprechen sein könnte, was Sie suchen; Sie vermitteln den typischen Erfolg und Misserfolg von (asynchronen) Prozessen auf konsistente Weise. –