gpt4 book ai didi

node.js - 如何通过错误处理在发布/提交请求中流式传输文件?

转载 作者:行者123 更新时间:2023-12-03 08:42:59 25 4
gpt4 key购买 nike

这不是关于“重构以下代码的最佳方法是什么”的问题。这是关于“如何重构以下代码以对这两个异常都具有任何控制权”。

我有以下代码在PUT请求中流式传输文件。

import fs from 'fs'
import got from 'got' // it doesn't really matters if it's `axious` or `got`

async function sendFile(addressToSend: string, filePath: string) {
const body = fs.createReadStream(filePath)
body.on('error', () => {
console.log('we cached the error in block-1')
})
try {
const result = await client.put(addressToSend, {
body,
})
} catch (e) {
console.log('we cached the error in block-2')
}
}

我正在尝试以一种使我有机会从一个地方捕获所有错误的方式重构此代码。

上面的解决方案没有给我测试 stream失败的方法。例如,如果我传递了一个不存在的文件,该函数将同时打印 we cached the error in block-1we cached the error in block-2,但是无论如何我都无法重新抛出该第一个错误或在测试中使用它。

注意:

我不确定解决问题的最佳方法是否是这样做:

因为当我传递一个不存在的filePath时, rej函数将被调用两次,这是非常糟糕的做法。

function sendFile(addressToSend: string, filePath: string) {
return new Promise(async (res, rej) => {
const body = fs.createReadStream(filePath)
body.on('error', () => {
console.log('we cached the error in block-1')
rej('1')
})
try {
const result = await client.put(addressToSend, {
body,
})
res()
} catch (e) {
console.log('we cached the error in block-2')
rej('2')
}
})
}

最佳答案

我不太喜欢它,但这是我能想到的最好的方法:

function streamFilePut(client: Got, url: string, filePath: string) {
const body = fs.createReadStream(filePath)
const streamErrorPromise = new Promise((_, rej) => body.on('error', rej))

const resultPromise = new Promise((res, rej) => {
return client
.put(url, {
body,
})
.then(res, rej)
})

return Promise.race([streamErrorPromise, resultPromise])
}

关于node.js - 如何通过错误处理在发布/提交请求中流式传输文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60026939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com