process.stdin的end事件如何觸發?---關於nodejs底層的標準輸入與輸出的坑
阿新 • • 發佈:2019-01-05
最近想用js來寫一點簡單的演算法題,node是使用process.stdin和process.stdout來實現標準輸入和輸出的,我的目標是實現*迴圈輸入*,遇到沒有輸入時,輸入結束。聽起來好像很簡單,那麼接下來我們就來試試。
官方文件
首先我們去看看官方文件
程式碼如下
process.stdin.setEncoding('utf8');
process.stdin.on('readable', () => {
var chunk = process.stdin.read();
if (chunk !== null) {
process.stdout.write(`data: ${chunk} `);
}
});
process.stdin.on('end', () => {
process.stdout.write('end');
});
執行這段程式,接著輸入,結果如下,變成了無無限迴圈的輸入,無論怎麼輸入都無法觸發’end’事件。
這是為什麼呢?
我們繼續去查閱官方文件
文件裡寫著:當完成沒有內容輸入時就可以觸發’end’事件。
看到這裡,感覺前面的程式碼並沒有錯,那麼為什麼他不會結束迴圈輸入呢?
我們把程式碼修改如下:
process.stdin.setEncoding('utf8');
process.stdin.on('readable' , () => {
var chunk = process.stdin.read();
if(typeof chunk === 'string'){
process.stdout.write(`stringLength:${chunk.length}\n`);
}
if (chunk !== null) {
process.stdout.write(`data: ${chunk}`);
}
});
process.stdin.on('end', () => {
process.stdout.write('end');
});
執行結果如下:
當輸入一個字元的時候字串長度為3,之後都是字串長度加2,這是什麼原因呢?
你還記得你每次輸入結束之後都要敲的回車鍵嗎?回車鍵的字元就是’\n’
知道問題的原因就好解決了,既然加了回車字元,那麼我們就將回車字元去掉,最簡單的方法當然是切片。
chunk = chunk.slice(0,-2);
現在的資料就沒問題了。
原始碼修改如下:
process.stdin.setEncoding('utf8');
process.stdin.on('readable', () => {
var chunk = process.stdin.read();
if(typeof chunk === 'string'){
chunk = chunk.slice(0,-2);
process.stdout.write(`stringLength:${chunk.length}\n`);
}
if(chunk === ''){
process.stdin.emit('end');
return
}
if (chunk !== null) {
process.stdout.write(`data: ${chunk}\n`);
}
});
process.stdin.on('end', () => {
process.stdout.write('end');
});
就可以做到當沒有輸入時觸發’end’事件。
如果要做字串處理就在end事件內執行。