2016-05-31 31 views
1

我有一個應用程序,它接受json請求。這些json請求可以高達20萬。express bodyParser阻止事件循環

app.use(function (req, res, next) { 
    console.time("start2") 
    next(); 
}); 

app.use(bodyParser.json({ limit: '5mb' })); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cors()); 
app.enable('trust proxy'); 


app.use(function (req, res, next) { 
    console.timeEnd("start2") 
    next(); 
}); 

,什麼被打印到控制檯是

start2: 591ms 

我是正確的假設解析請求的JSON的物體阻擋了591毫秒的事件循環?

回答

0

不,你不能假設。在您的console調用之間需要大約600毫秒,但只有一部分將被body-parser解析JSON數據(其中阻塞事件循環)佔用。儘管如此,解析200K的JSON並不會花費太多時間。在我的Mac上,解析3MB的JSON文件需要大約50ms的時間。

我認爲這些591ms中的大部分實際上會花費讀取的請求體(它是非阻塞的)。

+0

感謝您的回覆。我通過這裏看看https://github.com/expressjs/body-parser/blob/master/lib/types/json.js#L91,它會是read()這是591ms的大部分是發生在非事件循環阻塞方式? –

+0

是的,這是我的猜測。您可以編輯項目的'。/ node_modules/body-parser'中的文件以添加一些額外的定時器,看看它是否真的正確:-) – robertklep

+0

看起來不錯。任何想法,爲什麼,類似的要求,有時需要幾毫秒和其他人,500 +毫秒?目前我還沒有看到任何其他請求發生。 –

0

不,你是正確的假設解析json正文花了591ms,但它並不一定阻止事件循環的時間。 Express中的中間件(和引擎蓋下的Connect)有意順序,但在大多數情況下它不應該阻止事件循環。它可以阻止事件循環,取決於你如何寫呢,但是你有時間僅僅是一個過了多長時間每個中間件措施調用next()