enableProxy是对当前发送的request请求开启代理,虽然确实会把请求转发到目标服务器(代理服务器),但是应该不是你需要的。
下面这段代码大致能满足你的需求,你可以参考下。其中getSign部分的逻辑用户校验来源,如果你是客户端发起的请求这部分意义不大
'use strict';
const crypto = require('crypto')
const secret = 'secret demo'
function getSign(timestamp) {
const hmac = crypto.createHmac('sha256', secret)
hmac.update('' + timestamp)
return hmac.digest('hex')
}
async function proxy(event) {
const {
url,
options,
timestamp,
sign
} = JSON.parse(event.body)
if (!timestamp || Math.abs(Date.now() - timestamp) > 600 * 1000) {
console.error('客户端时间与服务端差距过大')
throw new Error('invalid request')
}
if (!sign || sign !== getSign(timestamp)) {
console.error('sign校验未通过')
throw new Error('invalid request')
}
const res = await uniCloud.httpclient.request(url, {
followRedirect: true,
...options
})
return {
mpserverlessComposedResponse: true,
isBase64Encoded: true,
statusCode: res.status,
headers: res.headers,
body: res.data.toString('base64')
}
}
exports.main = async (event, context) => {
try {
const res = await proxy(event)
return res
} catch (e) {
return {
mpserverlessComposedResponse: true,
isBase64Encoded: false,
statusCode: 500,
headers: {
'content-type': 'text/plain'
},
body: e.message
}
}
};
2 个回复
W***@163.com (作者)
捞
DCloud_uniCloud_WYQ
enableProxy是对当前发送的request请求开启代理,虽然确实会把请求转发到目标服务器(代理服务器),但是应该不是你需要的。
下面这段代码大致能满足你的需求,你可以参考下。其中getSign部分的逻辑用户校验来源,如果你是客户端发起的请求这部分意义不大
W***@163.com (作者)
感谢感谢!!!
2022-04-13 13:09
W***@163.com (作者)
前辈我再次向您确定下思路:
1 云函数url化
2 客户端我使用的是ajax-hook和fetch-intercept分别拦截xhr和fetch请求,拦截后把将要发出的请求替换为url化的云函数。这样就在客户端调用了云函数。
3 执行您上述的代码示例
对于第二步我不是特别确定,总觉得serverless做代理转发这样操作不是很好的解法。想请教前辈这样操作是否正确。感谢!
2022-04-24 10:49
DCloud_uniCloud_WYQ
回复 W***@163.com: 你看能实现自己需求就行。云函数转发网络请求有个需要注意的是,云函数在实例不复用且未开启固定ip的情况下,出口ip是会变的。其他的跟你自己写个node服务转发没太大区别
2022-04-27 16:22
W***@163.com (作者)
回复 DCloud_uniCloud_WYQ: 谢谢前辈的解答!!
2022-04-29 08:50