NodeJS js:我应该在产品代码中保留'assert()'吗?

ebdffaop  于 2023-02-12  发布在  Node.js
关注(0)|答案(3)|浏览(150)

一个 * 方法 * 问题:
我正在使用node.js、mongodb和express.js实现一些服务的API接口。
在许多(几乎所有)网站上,我看到这样的代码:

method(function(err, data) {
  assert.equal(null, err);
});

问题是:我应该在生产时在代码中保留assert语句吗(至少对于"低重要性"错误)?或者,这些只是为了 * 测试 * 代码,我应该更好地每次处理所有错误吗?

gfttwv5a

gfttwv5a1#

您绝对不应该将它们保留在“生产”环境中。
如果你在谷歌上搜索一下,就会发现有太多的替代方法可以去除它们。
就我个人而言,我会使用null object模式,在单独的文件中实现两个 Package 器:前者将其方法直接Map到由模块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
b1zrtrql

b1zrtrql2#

**是的!**Assert在生产代码中是好的。

1.Assert允许开发人员记录代码所做的假设,使代码更易于阅读和维护。
1.Assert在生产中失败比允许Assert所保护的未定义行为更好。当Assert失败时,您可以更容易地发现问题并修复它。
1.知道代码在假设范围内工作远比获得一点性能增益更有价值。
我知道大家意见不一,但我的答案是肯定的,因为我有兴趣看看市民如何投票。

ffdz8vbo

ffdz8vbo3#

大概没有
参考:When should assertions stay in production code?
在我的代码中,大多数情况下我把错误处理函数放在一个单独的文件中,并在任何地方使用相同的错误处理方法,这主要取决于逻辑
像ppl一般忘记这一点

process.on('uncaughtException', function (err) {
  console.log(err);
})

和err == null不会造成伤害,它会检查null和undefined

相关问题