gpt4 book ai didi

javascript - 在 express 的路由处理程序中临时覆盖原型(prototype)方法是否安全?

转载 作者:行者123 更新时间:2023-11-30 11:39:44 25 4
gpt4 key购买 nike

我有一个对象,里面有很多 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 的内部实现发生变化,它可能会在将来停止工作 - 依赖它不改变是一个泄漏的抽象,将来有损坏的风险。

你可以在这里做一些其他的事情:

  1. 您可以为日期使用自己的自定义对象,并根据需要进行转换。
  2. 您可以使用自己的函数来准备 JSON 而不是依赖内置的 express 函数
  3. 您可以使用 replacer JSON.stringify 的参数对您有利
  4. 您可以对整个对象使用自定义对象来进行 strigify,而不仅仅是数字 1 中的日期

对于数字 3,请参阅:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

The replacer parameter can be either a function or an array. As a function, it takes two parameters, the key and the value being stringified. The object in which the key was found is provided as the replacer's this parameter. Initially it gets called with an empty key representing the object being stringified, and it then gets called for each property on the object or array being stringified. [...] If you return a String, that string is used as the property's value when adding it to the JSON string.

在您的特定情况下,替换器可以只返回您想要的格式化日期,并返回其他所有内容不变。 JSON.stringify() 的替换参数专为此类情况而创建。

关于javascript - 在 express 的路由处理程序中临时覆盖原型(prototype)方法是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43186668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com