qiniu / nodejs-sdk

Qiniu Resource (Cloud) Storage SDK for Node.js
586 stars 190 forks source link

在Deno Deploy上无法执行上传操作 #428

Closed champkeh closed 5 months ago

champkeh commented 5 months ago

image

上传操作部分代码如下:

const token = getToken(opts.bucket)

const config = new qiniu.conf.Config()
const formUploader = new qiniu.form_up.FormUploader(config)
const putExtra = new qiniu.form_up.PutExtra()
putExtra.mimeType = opts.mimeType

return new Promise((resolve, reject) => {
    formUploader.put(token, opts.file, opts.content, putExtra, (err, body, resp) => {
        if (err) {
            reject(err)
        } else if (resp.status === 200) {
            resolve(body)
        } else {
            reject(new Error(body.error))
        }
    })
})

可能是由于Deno Deploy环境无法向系统写入临时文件,所以出现上面的报错信息。

请问有没有在无写入权限的服务器环境执行上传操作呢?

lihsai0 commented 5 months ago

@champkeh 当前版本可以通过配置区域满足您的需求,具体有两种实现方式

第一种,通过直接配置上传的区域。优点:实现简单。缺点:无法根据不同 bucket 选择上传域名。

const config = new qiniu.conf.Config({
    useHttpsDomain: true,
    regionsProvider: new qiniu.httpc.StaticRegionsProvider([
        // Region ID 参考 https://developer.qiniu.com/kodo/1671/region-endpoint-fq
        qiniu.httpc.Region.fromRegionId('z0')
    ])
})

第二种,配置为直接查询上传区域。优缺点与第一种相反。

const queryRegionsEndpoints = [qiniu.conf.QUERY_REGION_HOST]
    .concat(qiniu.conf.QUERY_REGION_BACKUP_HOSTS)
    .map(h => new qiniu.httpc.Endpoint(h, { defaultScheme: 'https' }))
const config = new qiniu.conf.Config({
    useHttpsDomain: true,
    regionsProvider: new qiniu.httpc.QueryRegionsProvider({
        accessKey: your_ak,
        bucketName: your_bucket,
        endpointsProvider: new qiniu.httpc.StaticEndpointsProvider(queryRegionsEndpoints)
    })
})

后续会看下优化支持更方便的配置缓存级别。

champkeh commented 5 months ago

按照第一种方式写的时候,会报 ts 类型错误: image

然后执行的时候也报 undefined 错误:

image

用的版本是 qiniu@7.8.0:

image

我目前改用前端上传的那个 qiniu-js 包来上传了(需要在 deno 环境打个 xhr 的补丁),不过不知道这两个包在上传方面有没有什么区别

lihsai0 commented 5 months ago

@champkeh

您这边第一次反馈时,使用的是 7.11.0 版本。在 7.10.0 对区域查询引入了文件级别缓存与重构后的区域类型。

在 7.8.0 版本不应该遇到您第一次反馈的问题。如确定使用 7.8.0 请检查您的 Deno Deploy 流程,确保依赖版本与 yarn.lock 一致。

qiniu-js 与本仓库在表单上传整体区别不大。主要区别在于重试策略等细节。

champkeh commented 5 months ago

哦哦谢谢,第二次我是在本地试的,应该是缓存的老版本,我再试一下新版本

champkeh commented 5 months ago

用7.11.0版本可以了,非常感谢!

不过稍微有点小瑕疵,就是 ts 类型会报这样一个警告:

image

不知道是deno的问题还是这个库的问题,不过不影响使用

lihsai0 commented 5 months ago

@champkeh 不要意思,手残了。请去掉 new。