Featured image of post express 重複 send

express 重複 send

express 重複 send

問題

在 express route 裡面,我通常會在 res.send() 之類的函式前面都會加一個 return 防止因為程式邏輯漏洞造成重複送出然後噴 error。像是這樣

1
2
3
route.get('/', (req, res, next) => {
	return res.send('Hello world');
});

但是如果我們用到 Promise 的時候 return 並不會跳出整個 route,所以我們需要另一個方法,我的想法是一個變數儲存是否送出,然後在每次送出前都判斷,送出候更改變數值

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
+--------------------------+
| is sent( flag === false) |
+-+------------------------+
  |no
  |
+-+----+
| send |
+-+----+
  |
+-+-----------+
| change flag |
+-------------+
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
route.get('/', (req, res, next) => {
	let flag = false;
	doSomePromise().then(() => {
		// do something
		if (!flag) {
			res.send('Hello world');
			flag = true;
		}
	});
});

這樣就不會噴一堆 error 啦!

改進版

用了之後發現這樣有點麻煩,express 應該有內建變數儲存是否已送出才對,如果沒有,我應該也有更好的方法可以直接從 reqres 的狀態判斷是否已送出。找了一下,真的被我找到了 res.headersSent 這個內建變數,他的行為就和上面的 flag 一模一樣,但是我們不用自己去維護他的狀態。所以上面的範例就可以改寫成這樣

1
2
3
4
5
6
route.get('/', (req, res, next) => {
	doSomePromise().then(() => {
		// do something
		res.headersSent || res.send('Hello world');
	});
});
好想養貓阿~~
使用 Hugo 建立
主題 StackJimmy 設計