从 NodeJS 中退出 TextDecoderStream()

Get Out of a TextDecoderStream() from NodeJS

当我使用 res.status(400).send(err.stack); 从我的 express nodejs 应用程序发送错误消息时,我似乎无法退出我在接收端设置的解码器流。

这是我在浏览器中的代码(限于 fetch 部分):

fetch("/the/url", {
    method: "POST",
    body: formData,
}).then(response => {
    if (response.status === 200) {
        return response.blob().then((data) => {
            return data;
        });
    } else {
        return new Promise((resolve, reject) => {
            let err_message = "";
            let reader = response.body.pipeThrough(new TextDecoderStream()).getReader();
            reader.read().then(({done, value}) => {
                // When no more data needs to be consumed, close the stream
                if (done) {
                    reject(err_message);
                    return;
                }
                // Enqueue the next data chunk into our target stream
                err_message += value;
            });
        }).then((res) => {
            return (res)
        }).catch((err) => {
            return (err)
        });
    }
}).then((res) => {
    console.log(res)
}).catch((err) => {
    console.log(err)
});

我已经在所有后续 thencatch 上设置了断点,但它从来没有 resolves/rejects。

感谢任何指点。

如果对某人有帮助,您需要对同一函数进行递归调用才能正确跳出。 根据以下内容:

fetch("/the/url", {
    method: "POST",
    body: formData,
}).then(response => {
    if (response.status === 200) {
        return response.blob().then((data) => {
            return data;
        });
    } else {
        return new Promise((resolve, reject) => {
            let err_message = "";
            let reader = response.body.pipeThrough(new TextDecoderStream()).getReader();
            reader.read().then(function processText({done, value}) {
                // When no more data needs to be consumed, close the stream
                if (done) {
                    reject(err_message);
                    return;
                }
                // Enqueue the next data chunk into our target stream
                err_message += value;
                return reader.read().then(processText);
            });
        }).then((res) => {
            return (res)
        }).catch((err) => {
            return (err)
        });
    }
}).then((res) => {
    console.log(res)
}).catch((err) => {
    console.log(err)
});

来自 https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/getReader