process.stdin的end事件如何觸發?---關于nodejs底層的標準輸入與輸出的坑

最近想用js來寫一點簡單的算法題,node是使用process.stdin和process.stdout來實現標準輸入和輸出的,我的目標是實現****循環輸入****,遇到沒有輸入時,輸入結束。聽起來好像很簡單,那么接下來我們就來試試。

官方文檔

首先我們去看看官方文檔

process.stdin

代碼如下

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'事件

Paste_Image.png

這是為什么呢?
我們繼續去查閱官方文檔

Paste_Image.png

文檔里寫著:當完成沒有內容輸入時就可以觸發'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');
});

運行結果如下:

Paste_Image.png

當輸入一個字符的時候字符串長度為3,之后都是字符串長度加2,這是什么原因呢?
你還記得你每次輸入結束之后都要敲的回車鍵嗎?回車鍵的字符就是'\n'
知道問題的原因就好解決了,既然加了回車字符,那么我們就將回車字符去掉,最簡單的方法當然是切片。

chunk = chunk.slice(0,-2);
Paste_Image.png

現在的數據就沒問題了。

原代碼修改如下:

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'事件。

Paste_Image.png

如果要做字符串處理就在end事件內執行。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容