Sono abituato a pensare in Java e sto cercando di capire come node.js. Il mio programma ha bisogno di registrare le informazioni quando le cose vanno male, e trovo che devo inserire un sacco di codice boilerplate nel mio programma node.js per ottenere ciò che otterrei gratuitamente in Java."Call stack" per i callback in node.js
La mia domanda si riduce a:
- c'è un/modo più semplice non boilerplate per ottenere informazioni stack-come in una catena di callback? e/o
- Sono incolpevole di non riuscire a comprendere correttamente node.js, e di provare a forzare node.js asincrono ad essere più simile a Java sincrono?
Java Esempio
Ecco un programma di Noddy Java che cerca (e non) per connettersi a un database Mongo: 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");
}
}
... che dà questo output di stack utile:
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)
(In particolare, le ultime 4 linee Show Me "ciò che stava accadendo" nel mio codice al momento si è verificato l'errore di Mongo .)
Node.js Esempio
Ecco il mio tentativo di ri-scrivere il mio programma nel node.js:
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);
});
}
... che dà questo output:
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]]
Ma per ottenere questo risultato, devo mettere in un sacco di codice standard per tutto il mio programma, che sta per essere un dolore alla polizia come il mio programma diventa più grande e ho un intero team di sviluppo.
Posso ottenere questo output simile allo stack in un altro modo? È improbabile aspettarsi questo tipo di output?
promesse potrebbe essere quello che state cercando; trasmettono il tipico successo e fallimento dei processi (asincroni) in modo coerente. –