Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在express'中临时覆盖原型方法是否安全;路线管理员?_Javascript_Node.js_Express - Fatal编程技术网

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的内部实现发生更改,它将来可能会停止工作—依赖它不更改是一种泄漏的抽象,将来可能会有中断的风险

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

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

    replacer参数可以是函数或数组。作为一个函数,它接受两个参数,键和被字符串化的值。在其中找到密钥的对象作为替换者的this参数提供。最初,它用一个表示被字符串化的对象的空键调用,然后为被字符串化的对象或数组上的每个属性调用它。[…]如果返回一个字符串,则在将该字符串添加到JSON字符串时,该字符串将用作属性的值


    在您的特定情况下,替换者只需返回您想要的格式的日期,并返回所有其他内容不变。
    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))