fix(nodejs-client): replace stale user fields in native upload forms (#44120)

This commit is contained in:
D41910
2026-10-15 05:37:27 +08:00
committed by GitHub
parent 6f79102c0c
commit f566fa4648
2 changed files with 96 additions and 4 deletions
+8 -4
View File
@@ -26,8 +26,12 @@ const toConfig = (init: string | DifyClientConfig, baseUrl?: string): DifyClient
return init
}
const appendUserToFormData = (form: SdkFormData, user: string): void => {
form.append('user', user)
const setUserOnFormData = (form: SdkFormData, user: string): void => {
if ('set' in form && typeof form.set === 'function') {
form.set('user', user)
} else {
form.append('user', user)
}
}
export class DifyClient {
@@ -178,7 +182,7 @@ export class DifyClient {
throw new FileUploadError('FormData is required for file uploads')
}
ensureNonEmptyString(user, 'user')
appendUserToFormData(form, user)
setUserOnFormData(form, user)
return this.http.request({
method: 'POST',
path: '/files/upload',
@@ -205,7 +209,7 @@ export class DifyClient {
throw new FileUploadError('FormData is required for audio uploads')
}
ensureNonEmptyString(user, 'user')
appendUserToFormData(form, user)
setUserOnFormData(form, user)
return this.http.request({
method: 'POST',
path: '/audio-to-text',
@@ -0,0 +1,88 @@
import type { AddressInfo } from 'node:net'
import { createServer } from 'node:http'
import { afterAll, beforeAll, describe, expect, it } from 'vite-plus/test'
import { DifyClient } from '../src/client/base'
describe('upload user fields', () => {
const server = createServer((req, res) => {
void (async () => {
const chunks: Buffer[] = []
for await (const chunk of req as AsyncIterable<Uint8Array>) {
chunks.push(Buffer.from(chunk))
}
const request = new Request('http://localhost', {
method: 'POST',
headers: { 'content-type': req.headers['content-type'] ?? '' },
body: new Uint8Array(Buffer.concat(chunks)),
})
const form = await request.formData()
const file = form.get('file') as File
res.writeHead(200, { 'content-type': 'application/json' })
res.end(
JSON.stringify({
users: form.getAll('user'),
fileName: file.name,
fileText: await file.text(),
extra: form.get('extra'),
}),
)
})().catch(() => {
res.writeHead(500)
res.end()
})
})
let client: DifyClient
beforeAll(async () => {
await new Promise<void>((resolve) => server.listen(0, '127.0.0.1', resolve))
const address = server.address() as AddressInfo
client = new DifyClient({
apiKey: 'test',
baseUrl: `http://127.0.0.1:${address.port}`,
maxRetries: 0,
})
})
afterAll(async () => {
await new Promise<void>((resolve, reject) => {
server.close((error) => (error ? reject(error) : resolve()))
})
})
const makeForm = () => {
const form = new FormData()
form.append('file', new Blob(['payload']), 'sample.txt')
form.append('extra', 'preserved')
return form
}
it.each(['fileUpload', 'audioToText'] as const)(
'%s replaces existing user fields',
async (method) => {
const form = makeForm()
form.append('user', 'stale-user')
form.append('user', 'another-user')
const response = await client[method](form, 'current-user')
expect(response.data).toEqual({
users: ['current-user'],
fileName: 'sample.txt',
fileText: 'payload',
extra: 'preserved',
})
},
)
it.each(['fileUpload', 'audioToText'] as const)(
'%s can reuse native FormData for a new user',
async (method) => {
const form = makeForm()
const first = await client[method](form, 'first-user')
expect(first.data.users).toEqual(['first-user'])
const second = await client[method](form, 'second-user')
expect(second.data.users).toEqual(['second-user'])
expect(second.data.fileText).toBe('payload')
},
)
})