NodeJS回调函数的错误参数

5

我现在正在学习node,但是对于错误参数(err parameter)感到困惑。 我认为它应该是回调函数的第一个参数,但是我在很多回调函数中并没有看到它。有人能给我解释一下吗?谢谢!


1
标准的节点回调形式 callback(err, result) 被节点库和试图保持一致风格的库所使用。然而,库作者没有义务遵循它。因此,如果你正在查看用户代码,你可能会发现它被使用或未被使用。 - barry-johnson
你能展示一些没有使用它的例子吗? - robertklep
例如,在使用某些模块时:var net = require('net'); var server = net.createServer(function(connection) { connection.on('end', function() { console.log('客户端已断开连接'); }); }); - diodeBucks
3个回答

1

错误参数通常用于异步代码。 Node.js 错误处理

大多数接受回调函数的异步方法都会接受一个 Error 对象作为该函数的第一个参数。如果该第一个参数不为 null 而且是 Error 的实例,则发生了应该被处理的错误。

app.get() 发送 get 请求并返回像 404 这样的错误。

你可以在 app.get() 中执行类似这样的操作 res.status(404).render()

Express 错误处理

错误处理函数有四个参数,而不是三个:(err, req, res, next)

一些代码将 err 作为第一个参数的原因是,一些代码如 fs.readFile 是编程来检查是否有错误并处理它。 API 的作者专门编写了代码来检查第一个参数是否为错误并处理它。 这就是为什么对于某些方法可用,对于其他方法则不可用。


1

有许多不同种类的函数,特别是回调函数。在Node.js中,回调函数的标准形式如下:

function(err, arg1, arg2, ...)

当relevant时,arg1等参数才存在,但err参数总是第一个。这与许多历史JavaScript代码的相反,其中错误是最后一个参数。

即使没有错误,Node.js强制将错误作为第一个参数也使忽略错误更加困难,你很少会忘记声明该参数,并且使它们的位置可预测。

现在,这仅适用于通用回调的情况。也就是说,有时调用函数将在将来某个时间触发单个回调。您将看到它们像这样使用:

doStuff(function(err, successValue) { ... });

还有一种由jQuery流行的风格,其中根据操作结果将触发一个或多个回调函数:

doStuff({
  success: function(successValue) { ... },
  error: function(err) { ... },
  timeout: function() { ... }
});

注意,在这种情况下,可能会触发错误和超时回调。您不必填写所有这些内容。
这种方法的缺点是无法预测哪些回调会被调用,并且有意外处理两次某些内容的风险。

0

首先:回调函数只是一个函数。不同的回调函数有不同的用途。

通常,执行异步操作并应“返回”值的函数会传递一个回调函数,该函数将使用(至少)两个参数:第一个用于传递错误(如果有),第二个(及其后续)用于传递应返回给调用者的值。

您注意到 net.createServer() 也会接受一个回调函数,但该函数只有一个参数。

这是因为,在这种情况下,回调函数不用于传递错误和/或值。相反,它是在新连接建立到服务器时调用的函数。

这实际上是一种快捷方式。这段代码:

var server = net.createServer(function(connection) {
  ...
});

这段代码的缩写是:

var server = net.createServer();
server.on('connection', function(connection) {
  ...
});

谢谢!但我注意到在express中,err参数并不经常使用。就像这段简单的代码:var express = require('express'); var app = express(); app.get('/', function (req, res) { res.send('Hello World'); })为什么回调函数不需要使用err呢? - diodeBucks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接