Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Express NodeJS-编辑和代理多部分/表单数据请求_Express_Proxy_Multipart_Form Data_Http Proxy Middleware - Fatal编程技术网

Express NodeJS-编辑和代理多部分/表单数据请求

Express NodeJS-编辑和代理多部分/表单数据请求,express,proxy,multipart,form-data,http-proxy-middleware,Express,Proxy,Multipart,Form Data,Http Proxy Middleware,我有一个微服务,它代理每个请求,并在其中添加一个字段。对于普通请求,这很简单,只需在request.body中添加字段并正确设置标题,但是对于多部分/表单数据请求,我从几天以来就遇到了麻烦,因为如果我在request.body中添加字段,它将消失 const router=express() const routes=require(“~/routes”) const passport=require(‘passport’) const proxy=require('http-proxy-mid

我有一个微服务,它代理每个请求,并在其中添加一个字段。对于普通请求,这很简单,只需在request.body中添加字段并正确设置标题,但是对于多部分/表单数据请求,我从几天以来就遇到了麻烦,因为如果我在request.body中添加字段,它将消失

const router=express()
const routes=require(“~/routes”)
const passport=require(‘passport’)
const proxy=require('http-proxy-middleware')
router.use(passport.initialize())
要求('./模块/护照jwt')(护照)
路由器。使用(“/”,路由)
路由器使用(
“/帐户”,
authenticate('jwt',{session:false}),
代理({
目标:process.env.ACCOUNT_服务,
路径重写:{'/account':'/'},
onProxyReq:重新扫描
})
)
const restream=异步函数(proxyReq、req、res、options){
如果(请求用户){
如果(
请求标题['content-type']&&
请求标题['content-type'].match(/^multipart\/form data/)
) {
req.body.reqUser=req.user
}否则{
const requestBody=JSON.stringify({…req.body,reqUser:req.user})
proxyReq.setHeader('Content-Type','application/json')
proxyReq.setHeader('Content-Length',Buffer.bytellength(requestBody))
proxyReq.write(请求主体)
}
}
}
当请求到达另一个微服务时,request.body为空,在它被写入之后,它将把多部分/表单数据参数放入request.body

我真的需要一个解决方案,让我能够在proxy restream函数中的多部分/表单数据请求中附加一个字段


我尽了一切努力想在这方面取得成功,但我被卡住了。我希望我这边的一切都很清楚。如果你需要,不要害怕询问更多细节。我请求你的帮助。

我终于想出了成功的办法。 我的代码现在如下所示:

------WebKitFormBoundaryiBtoTWFkpAG6CgXO\r\n
Content-Disposition: form-data; name="firstname"\r\n
\r\n\
Andrea\r\n
const router=express()
const routes=require(“~/routes”)
const passport=require(‘passport’)
const proxy=require('http-proxy-middleware')
router.use(passport.initialize())
要求('./模块/护照jwt')(护照)
路由器。使用(“/”,路由)
路由器使用(
“/帐户”,
authenticate('jwt',{session:false}),
代理({
目标:process.env.ACCOUNT_服务,
路径重写:{'/account':'/'},
onProxyReq:重新扫描
})
)
const restream=异步函数(proxyReq、req、res、options){
如果(请求用户){
如果(
请求标题['content-type']&&
请求标题['content-type'].match(/^multipart\/form data/)
) {
//使用所需的数据以多部分/表单数据格式构建字符串
常量formdataUser=
`--${request.headers['content-type'].replace(/^.*boundary=(.*)$/,'$1')}\r\n`+
`内容处置:表单数据;name=“reqUser”\r\n`+
`\r\n`+
`${JSON.stringify(request.user)}\r\n`
//设置新的内容长度
proxyReq.setHeader(
“内容长度”,
parseInt(request.headers['content-length'])+formdataUser.length
)
proxyReq.write(formdataUser)
}否则{
const body=JSON.stringify({…req.body,reqUser:req.user})
proxyReq.setHeader('Content-Type','application/json')
proxyReq.setHeader('Content-Length',body.Length)
proxyReq.write(正文)
}
}
}
正如我在代码注释中所写的:

  • 以多部分/表单数据格式生成字符串,该格式必须如下所示:

    ------WebKitFormBoundaryiBtoTWFkpAG6CgXO\r\n
    Content-Disposition: form-data; name="firstname"\r\n
    \r\n\
    Andrea\r\n
    
    (在我的代码中,我对数据进行了字符串化,因为它是一个对象)

  • 通过将上述字符串长度添加到 原始请求长度

  • 使用proxyReq.write函数发送新数据