Ошибка «write after end» на сервере с nodejs с использованием through2-map - PullRequest
0 голосов
/ 02 марта 2020

Первый запрос API успешно отправил ответ. Однако, когда я делаю другой запрос GET, выдается сообщение об ошибке «запись после завершения».

Когда я выключаю .pipe(addThing), тогда он работает на последовательных вызовах.

Функция through2-map как-то завершает соединение или ответ?

const fs = require('fs');
const express = require("express");
const route = express.Router();
const map = require("through2-map")
const csv2json = require("csv2json");
const firstThreeDigits = new RegExp(/[\s]*\d{3}/);

route.get("/", function(_, res){
  fs.createReadStream('./data/data.csv')
    .pipe(addThing)
    .pipe(csv2json({
      separator: ';'
    }))
    .pipe(res)
});

const addThing = map(function (chunk) {
  const chunkArr = chunk.toString().split('\n');
  const chunkWithNumber = chunkArr.map((line, index) => {
    if (index === 0) {
      return 'Number;' + line
    }
    return firstThreeDigits.exec(line) + ';' + line
  })
  return chunkWithNumber.toString().split(',').join("\n")
});

module.exports = route;

Не уверен, что это актуально, но CSV:

. / Data / data.csv

Thing;Latitude;Longitude
FOO-123 Banana;52.09789;3.113278
BAR-456 Monocle;52.034599;5.11235

1 Ответ

0 голосов
/ 02 марта 2020

После прочтения «Ошибка: запись после завершения» с помощью csv-write-stream Я заметил, что проблема может заключаться в том, что переменная addThing не создается новой при каждом последовательном вызове.

Выделено в память.

Итак, решение:

fs.createReadStream('./data/cameras-defb.csv')
    .pipe(map(addThing))
    .pipe(csv2json({
      separator: ';'
    }))
    .pipe(res);

function addThing(chunk) {
  const chunkArr = chunk.toString().split('\n');
  const chunkWithNumber = chunkArr.map((line, index) => {
    if (index === 0) {
      return 'Number;' + line
    }
    return firstThreeDigits.exec(line) + ';' + line
  })
  return chunkWithNumber.toString().split(',').join("\n")
})
...