Node.js:我应该在生产代码中保留`assert()`

Mar*_*coS 8 assert assertions node.js

一个方法论问题:

我正在使用node.js,mongodb和express.js为某些服务实现API接口.

在许多(几乎所有)网站上,我看到这样的代码:

method(function(err, data) {
  assert.equal(null, err);
});
Run Code Online (Sandbox Code Playgroud)

问题是:我是否应该assert在生产时将代码保留在我的代码中(至少对于"低重要性"错误)?或者,这些仅用于测试代码,我应该每次更好地处理所有错误?

sky*_*ack 4

您绝对不应该将它们保留在生产环境中。

如果你用谷歌搜索一下,就会发现有很多替代方法可以去除它们。

就我个人而言,我会null object通过在单独的文件中实现两个包装器来使用该模式:前者将其方法直接映射到 module 导出的方法assert,后者提供空函数,仅此而已。

因此,在运行时,您可以通过依赖先前正确设置的某些全局变量(例如process.env.mode. 在您的文件中,您只需导入上述模块并使用它,而不是直接使用assert.

这样,在您的代码周围,您将永远不会看到像 之类的容易出错的内容myAssert && myAssert(cond),而是您将拥有更干净、更安全的myAssert(cond)语句。

下面是一个简短的示例:

// myassert.js
var assert = require('assert');
if('production' === process.env.mode) {
    var nil = function() { };
    module.exports = {
        equal = nil;
        notEqual = nil;
        // all the other functions
    };
} else {
    // a wrapper like that one helps in not polluting the exported object
    module.exports = {
        equal = function(actual, expected, message) {
            assert.equal(actual, expected, message);
        },
        notEqual = function(actual, expected, message) {
            assert.notEqual(actual, expected, message);
        },
        // all the other functions
    }
}


// another_file.js
var assert = require('path_to_myassert/myassert');
// ... your code
assert(true, false);
// ... go on
Run Code Online (Sandbox Code Playgroud)

  • 如果您担心减少 Node.js 中的 CPU 周期,那么您真的玩错了游戏...... (24认同)
  • 您能否详细说明一下为什么不应将它们保留在生产环境中? (8认同)
  • 重新*“空对象模式”* - 我喜欢这个想法,但它似乎还不够,因为断言的*昂贵*部分是*评估表达式*。即使您将其传递给不执行任何操作的方法,该评估也会发生。需要删除整个断言语句 - 除非您将断言限制为廉价的计算。OTOH,昂贵的断言非常罕见,也许您会接受“if (DEBUG) assert(...)”。 (3认同)