【发布时间】:2014-06-08 04:45:48
【问题描述】:
我习惯于使用 Java 进行思考,并且正在尝试了解 node.js。当出现问题时,我的程序需要记录信息,我发现我必须在我的 node.js 程序中放入大量样板代码才能获得我在 Java 中免费获得的内容。
我的问题归结为:
- 是否有一种更简单/非样板的方法可以在回调链中获取类似堆栈的信息?和/或
- 我是否因为未能正确掌握 node.js 并试图强制异步 node.js 更像同步 Java 而感到内疚?
Java 示例
这是一个尝试(但失败)连接到 Mongo 数据库的 Java 程序: 导入 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");
}
}
...这提供了有用的堆栈输出:
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)
(特别是,最后 4 行向我展示了 Mongo 错误发生时我自己的代码中的“发生了什么”。)
Node.js 示例
这是我在 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);
});
}
...给出这个输出:
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]]
但是为了得到这个输出,我必须在整个程序中放入大量样板代码,随着我的程序变得越来越大并且我有一个完整的开发团队,这对警察来说会很痛苦。
我可以通过另一种方式获得这种类似堆栈的输出吗?期待这种输出是非节点式的吗?
【问题讨论】:
-
Promise 可能是你想要的;它们以一致的方式传达(异步)流程的典型成功和失败。
标签: javascript node.js asynchronous stack-trace control-flow