我是 nodejs/Express.js 開發的新手。
我已經使用 Express.js / Typescript 構建了我的后端服務,并且定義了多個路由 / api 端點。一種是這樣的:
app.post('/api/issues/new', createNewIssue);
當用戶提交新照片時,瀏覽器將發送一個 post 請求(在我的應用中也稱為問題)。
用戶可以將一個問題發送給另一個用戶,后端會先查詢資料庫,找到符合“源用戶”和“目標用戶”條件的問題數量,然后在新問題中給新問題一個標識ID form srcUser-dstUser-[number],其中 number 是自動遞增的計數。
該createNewIssue功能是這樣的:
export const createNewIssue = catchErrors(async (req, res) => {
const srcUser = req.header('src_username');
const dstUser = req.header('dst_username');
// query database for number of issues matching "srcUser" and "dstUser"
...
const lastIssues = await Issue.find( {where: {"srcUser": srcUser, "dstUser": dstUser}, order: { id: 'DESC'}});
const count = lastIssues.length;
// create a new issue Entity with the ID `srcUser-dstUser-[count 1]`
const newIssue = await createEntity(Issue, {
...
id: `srcUser-dstUser-${count 1}`,
...
});
res.respond({ newIssue: newIssue});
})
假設后端同時收到多個具有相同srcUser和dstUser屬性的請求,是否會出現多個具有相同 id 的新問題的沖突?
我已經閱讀了一些關于 nodejs 是單執行緒的檔案,但我不確定這對于這個特定場景意味著什么。
除了這個場景中的業務邏輯,我對 Express JS / Node JS 有一些普遍的困惑:
當只有一個cpu核時,Express JS異步處理多個并發請求:它開始處理一個,不等待它完成,而是繼續處理下一個。這個理解準確嗎?
當有多個 cpu 核心時,Express JS / Node Js 是否以相同的方式利用它們?
uj5u.com熱心網友回復:
Node.js 不會自動為你解決這個問題。
雖然它一次只處理一件事,但完全有可能請求 2 將請求資料庫中的最新 ID,而請求 1await在同一點命中該陳述句并進入睡眠狀態。這意味著他們會得到相同的答案,并且每個人都會嘗試創建一個具有相同 ID 的新條目。
您需要撰寫 JavaScript 以確保不會發生這種情況。
處理此問題的通常方法是:
- 讓資料庫(而不是您的 JavaScript)處理 ID 生成(通常使用序列.
- 使用事務,以便對最新 ID 的請求和新行的插入被資料庫視為一個操作(因此它不會對請求 2 啟動相同的操作,直到對請求 1 的選擇和插入都完成) .
- 測驗以確保
createEntity成功(并且不會拋出“重復 ID”錯誤),如果失敗再試一次(有一個限制,以防它一直失敗,在這種情況下,它應該向客戶端回傳錯誤訊息)。
具體取決于您使用的資料庫。為了舉例,我鏈接到了 Postgresql 檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/363246.html
標籤:javascript 节点.js 表达
上一篇:使用MouseWheelc#winform繪制圖表水平滾動
下一篇:如何在npm中查找陣列元素?
