一個粗心大意引起的慘劇

如題,今天要來介紹一下是什麼樣的粗心大意,會引發一場慘劇呢?(其實根本不慘,只是很蠢而已,藉此告知大家千萬不要粗心大意啊啊啊啊啊)

先簡單介紹一下開發環境,我是使用 Node.js + MongoDB來進行開發的,以下就來簡述一下慘案發生的經過。

事情是這樣發生的,在某個風和日麗的下午,我泡了一杯180CC的維他命c準備對抗流感病毒,然後優雅的打開Webstorm準備開始寫程式(以上都是廢話)此次我想要完成的功能是這樣子的,當我修改了DB的內容,我希望可以拿到修正後的內容,這不是很簡單嘛,只要使用Mongoose 提供的findOneAndUpdate,就可以簡單的達到我的需求了,範例如下:

db.scores.findOneAndUpdate(
{ "userId": "1001", "name" : "Amy" },
{ $set: { "name" : "Ann"} },
{ new: true}
)

若我成功修改資料後,我應該會收到 {“name”: “Ann”}的資訊,但是並沒有!我只有收到null,null就表示我什麼資料都沒有修改!但是我看到DB中的資料早就被修改了呀,於是就開始尋找原因,其中還一度懷疑是否是Mongoose有問題(現在看來是我有問題才是)

最終,終於找到問題發生的原因了,原來是我自己的程式沒有寫好

var promise = User.modifyUserNameAsync(userId, name);

if(action === 'modifyUserAge') {
User.modifyUserAgeAsync(userId, Age);
}
promise
.then(function (result) {
......
})
.catch(function (err) {
......
});

不知道有沒有人已經看出來我粗心大意的地方在哪邊呢?如果沒有的話可以參考下面的解答。

var promise = User.modifyUserNameAsync(userId, name);

if(action === 'modifyUserAge') {
promise = User.modifyUserAgeAsync(userId, Age);
}
promise
.then(function (result) {
......
})
.catch(function (err) {
......
});

我在程式的開始已經有先定義好promise要做什麼事情了,所以如果我只是要modifyUserNameAsync 是不會有什麼問題,但今天發生問題的原因就在於我是要執行modifyUserAgeAsync 此段程式。問題發生的原因就在於我沒有在if中,將promise 的值指定為modifyUserAgeAsync,所以程式一直只有執從modifyUserNameAsync而已。

以上就是一個粗心大意引起的慘劇,為什麼稱之為慘劇呢? 因為我花了很多時間在確認findOneAndUpdate是否有錯誤,殊不知,一切都是我自己的問題。自己覺得有的時候在寫程式的時候,太想要求快了,想要寫完這段程式並測試結果是否正確,但有時候一些細節可能就會被略過,真的不要求快,求好求完整比較重要呀!

Show your support

Clapping shows how much you appreciated Elsa Wang’s story.