Node.js:我应该在生产代码中保留 `assert()` 吗?
Node.js: should I keep `assert()`s in production code?
一个方法问题:
我正在为一些服务实现一个 API 接口,使用 node.js、mongodb 和 express.js。
在许多(几乎所有)网站上,我看到这样的代码:
method(function(err, data) {
assert.equal(null, err);
});
问题是:我是否应该在生产时在我的代码中保留 assert
语句(至少对于 'low significance' 错误)?或者,这些只是为了 测试 代码,我应该更好地处理每次的所有错误吗?
可能没有
参考:When should assertions stay in production code?
在我的代码中,大部分时间我将错误处理函数放在一个单独的文件中,并在所有地方使用相同的错误方法,无论如何它主要取决于逻辑
一般人都会忘记这个
process.on('uncaughtException', function (err) {
console.log(err);
})
并且 err==null 没有坏处,它同时检查 null 和 undefined
您绝对不应将它们保留在 生产 环境中。
如果你 google 有点,有很多替代方法可以去除它们。
就个人而言,我会通过在单独的文件中实现两个包装器来使用 null object
模式:前者将其方法直接映射到模块 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
一个方法问题:
我正在为一些服务实现一个 API 接口,使用 node.js、mongodb 和 express.js。
在许多(几乎所有)网站上,我看到这样的代码:
method(function(err, data) {
assert.equal(null, err);
});
问题是:我是否应该在生产时在我的代码中保留 assert
语句(至少对于 'low significance' 错误)?或者,这些只是为了 测试 代码,我应该更好地处理每次的所有错误吗?
可能没有
参考:When should assertions stay in production code?
在我的代码中,大部分时间我将错误处理函数放在一个单独的文件中,并在所有地方使用相同的错误方法,无论如何它主要取决于逻辑
一般人都会忘记这个
process.on('uncaughtException', function (err) {
console.log(err);
})
并且 err==null 没有坏处,它同时检查 null 和 undefined
您绝对不应将它们保留在 生产 环境中。
如果你 google 有点,有很多替代方法可以去除它们。
就个人而言,我会通过在单独的文件中实现两个包装器来使用 null object
模式:前者将其方法直接映射到模块 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