Trouble Shooting -- 绕弯解决EVE无$unset问题

本周,在Fix bug的过程中遇到了一个非常有意思的问题,解决了三天之久。在不停的探索,刨根问底地寻求帮助后,终于使用很投机取巧的方式解决了这个问题,以下就是对这个问题的描述以及解决的过程。

问题描述:

需要修改的项目某页面如下图所示:


需修改的页面

当用户点击橙色的“选择文件”按钮将正确的SROI模板上传至系统,系统会自动解析上传的SROI模板,并将解析后的数据显示在“区域1”,与其同时,上传的Excel文件名显示在区域2。

当用户点击“删除”button时,区域2中的文件会被删除,区域1中的数据不会被删除。我们期望的结果是:当点击“删除”button后,区域1和区域2的数据可以一同被删除。


代码中的解决方式及问题定位:

既然会发生点击“删除”按钮后,一处删除掉了,一处没有删除掉的情况,肯定是代码中出现了问题。现在就开始分析代码的写法。


现有代码

通过代码72--77行,我们可以看到,在点击“删除”按钮后,会弹出提示框,然后执行deleteAttachment function。Attachment.delete具体实现如下:


Attachment.delete

PS:项目使用的数据库是mongo,使用EVE对数据库进行操作。EVE官方文档上写着:Eve is an open source Python REST API framework designed for human beings. It allows to effortlessly build and deploy highly customizable, fully featured RESTful Web Services.

当触发删除操作后,会直接发送delete请求至EVE,然后删除数据库里的数据。那到底删除了数据库的什么数据呢?

数据库的结构大致是这样的:一个attachment的collection,专门存放各种附加Excel、图片等信息;一个project的collection,存放项目的基本信息。当触发delete操作后,前端发送了“$http.delete('/api/doc/files/attachment/projectId')”,对数据库中attachment进行了删除。与此同时,页面上区域2的数据,也就是attachment也被删除掉。而上传的Excel经过后台代码解析后,会将Excel中的数据存入project collection的sroi filed中,而页面上区域1的信息正是根据project collection的sroi filed显示的。所以,只需要把project collection中的sroi filed删除掉,就可以解决最初的问题。

解决思路:

方法一:


project collection存储结构


由于只想删除一个collection中的某个字段,很自然的想到了mongo中的unset方法,用法如下。


使用unset前project


使用unset后project

可以看到使用unset方法可以很方便的把project collection中的sroi和sroi_result字段删除掉并且不影响其他的字段。但是!项目中不是单纯的操作mongo,而是通过EVE对数据库进行操作,并且EVE对unet方法不!支!持!不支持!不支持!没办法,只能放弃unset这条路,继续探索新方法。

方法二:

既然不能直接删除,那就间接删除吧。

先通过get请求把project信息都取到,通过代码手动将sroi字段删除,再用update把新project更新到数据库中。


get project



get project response

可以发现response里比mongo里多了一些我们不想要的字段,(所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果),即使通过操作把sroi和sroi_result删除,也会在update的时候把多余字段加入到数据库中,从而引入脏数据。这个方式又被排除。

方法三:

直接删除和间接删除都不行,那就采取软删除的方式吧。

在数据库中加上一个isDelete字段,当需要使用project sroi时,先判断isDelete是否为true,为true表示已经被删除,数据就不可用了。看起来这种方式是可行的,但是!!关键是!!并不知道具体有多少地方使用到了sroi,从而不能确定需要改动哪些地方,改动量可能会非常非常大。

所以这种方式也被排除。

方法四:

upload 前端


deal sroi file api


第一次上传Excel表后,数据库project里已经存在了sroi字段,当第二次再上传Excel表,第二次表的内容会将第一次的数据覆盖掉。我们可以看到,当前端发送upload request后,后端会接收到Excel表并对其进行处理和保存,91,92和94行就是使用EVE将数据存入数据库。

从这个思路中,我们想到了另外一种解决方式:当点击“delete button”时,使用同upload相同的套路,只不过将result、formatData数据置空,同时使用put方式将数据update至数据库。


测试 method4 代码

在代码中,先发送post请求将Excel信息save到数据库中,再使用put方式变相清除数据。看似没有问题的测试代码,但是结果却是这样的。╮(╯▽╰)╭


result

不仅仅把sroi删除了,还把project中其他字段也删除了。 (`皿´) 好吧,put方法是全部更新,此时应该用patch方法更新部分信息。

于是乎,又开始看代码中httpClient部分的发送请求,然而我看到了什么。。。。


httpclient

默默的在风中凌乱了。。。_(:з」∠)_似乎已经把路走绝了。。

方法五:

在方法一中说到,没办法用unset将指定字段删除掉,但是它不能阻止我把指定字段替换掉啊。如果我把sroi中的内容用[ ]替换掉,只需要在前端显示的时候判断sroi内容是否为[ ]即可了 。

patch sroi to [ ]


result

看样子似乎成功了,可以成功替换为空。下面只需要考虑两个问题:改前端有sroi的部分,加上判断条件;再次上传Excel是否能成功。

第一个问题工作量大但是挺简单,先来看第二个吧。彡(-_-;)彡不能上传成功!不能!不!!!

当然把[ ]换成了null,string依旧不能保证第二次上传成功,好吧。You win!

方法。。。。

直接上可以work的解决方法吧。。。

right

既然[ ], string都不能保证第二次上传Excel成功,肯定是因为类型的原因,那如果我把sroi改为空的{ }就可以保证第二次Excel上传成功了。所以,首先把sroi字段置为null,再次置为{ }。。。好吧,接下来只添加前端显示部分的判断就好了。

(´థ౪థ)σ

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容