Javascript 在express'中临时覆盖原型方法是否安全;路线管理员?
我有一种情况,我有一个对象,其中有很多Javascript 在express'中临时覆盖原型方法是否安全;路线管理员?,javascript,node.js,express,Javascript,Node.js,Express,我有一种情况,我有一个对象,其中有很多Date实例。然后将对象转换为JSON,并返回: router.post('/', function () { // Some code that returns the object res.status(200).json(object); }); 我需要更改所有Date对象转换为JSON的方式,因此我考虑这样做: router.post('/', function() { var originalToJSON = Date.
Date
实例。然后将对象转换为JSON
,并返回:
router.post('/', function () {
// Some code that returns the object
res.status(200).json(object);
});
我需要更改所有Date
对象转换为JSON的方式,因此我考虑这样做:
router.post('/', function() {
var originalToJSON = Date.prototype.toJSON;
Date.prototype.toJSON = function() {
return moment(this).format(...); // some formatting function
}
res.status(200).json(object);
Date.prototype.toJSON = originalToJSON;
});
我意识到这是一种可怕的做法,但我很好奇这意味着什么。由于我在将对象转换为JSON后立即将
Date.prototype.toJSON
恢复到其原始状态,是否有可能同时出现res.status(200).JSON(object)
正在运行的请求,并获取被覆盖的Date.prototype.toJSON
?代码的其他部分将使用更改后的JSON
方法应该不会有问题,因为代码将运行到完成,并且不会在JSON
方法的两次更改之间产生或等待,但是存在这样一种风险,即您的代码可能不会使用更改过的方法—它实际上取决于res.json()
的实现,虽然它现在可以工作,但如果Express的内部实现发生更改,它将来可能会停止工作—依赖它不更改是一种泄漏的抽象,将来可能会有中断的风险
您可以在这里做一些其他事情:
replacer
参数在您的特定情况下,替换者只需返回您想要的格式的日期,并返回所有其他内容不变。
JSON.stringify()
的replacer参数是专门为这种情况创建的。在这种情况下,所有内容都是同步的,因此将一次性执行。因此,这样做应该是安全的
然而,搞乱原型通常是一个坏主意,尤其是当您的问题有更简单的解决方案时:
function toJSON(input) {
if(typeof input === 'date') {
return moment(input).format();
} else if(typeof input === 'object') {
let o = {};
Object.keys(input).map((key) => {
o[key] = toJSON(input[key]);
});
return o;
} else {
return input;
}
}
router.post('/', function() {
var originalToJSON = Date.prototype.toJSON;
Date.prototype.toJSON = function() {
return moment(this).format(...); // some formatting function
}
res.status(200).json(toJSON(object));
Date.prototype.toJSON = originalToJSON;
});
是否可以在您自己的函数中处理JS Object=>JSON转换?会更干净,不需要弄乱原型,工作也一样好<代码>res.status(200).json(toJSON(object))代码>。