在快速路由处理程序中暂时覆盖原型方法是否安全?
我有一个有很多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的内部实现发生变化,并且依赖于它不会改变的话,将来可能会停止工作具有将来破裂风险的抽象。
你可以在这里做其他的事情:
- 您可以使用自己的自定义对象的date,并将其转换,但是你想要的。
- 您可以使用您自己的准备JSON的function,而不是依靠内置的快速function
- 您可以使用JSON.stringify的
replacer
参数来获得您的优势 - 您可以使用整个对象的自定义对象进行分离,而不仅仅是数字1中的date
对于数字3,请参阅: https : //developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify
replacer参数可以是一个函数也可以是一个数组。 作为一个函数,它需要两个参数,键和值被串行化。 提供密钥的对象是作为替代者的这个参数提供的。 最初,它被一个空键代表被串化的对象调用,然后被对象或数组上的每个属性被串行化。 […]如果您返回一个string,则将该string添加到JSONstring时将用作该属性的值。
在你的特定情况下,replace者可以只是返回格式化的date,但是你想要的,并返回一切不变。 JSON.stringify()
的JSON.stringify()
参数是专门针对这种情况创build的。
在这种情况下,一切都是同步的,所以一次就能执行。 因此,这样做应该是安全的。
然而,搞乱原型通常是一个糟糕的主意,特别是当你的问题有更简单的解决scheme时:
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; });
- 为什么我的swig模板不能在我的MEAN web应用程序中渲染?
- Express.js + body-parser:POST请求中的空req.body
- 带有快速的angular度HTML5模式
- var express = require('express'); var app = express(),什么是express()? 它是一种方法还是一个构造函数? 它从何而来
- passport.js – facebook策略注销问题
- 请求正文有价值,但我无法访问它
- localhost:设置app.js后拒绝3000连接(Windows 7)
- passportjs LocalStrategy允许比默认的用户名和密码更多的参数吗?
- 如何访问另一个模型mongoose数据库中的一个模型模式