Comments (8)
@A-birdFlyHigner 未能复现。
您提供的 zip 没有包含七牛的代码。
以下是基于您的 zip 修改,可正常工作的代码。
- 安装 qiniu 包,例如
npm install qiniu
- 修改 home.js
const qiniu = require('qiniu');
const { Controller } = require('egg');
// 仅作演示,请根据实际需求选择合适的位置获取 bucketManager
const accessKey = process.env.QINIU_ACCESS_KEY;
const secretKey = process.env.QINIU_SECRET_KEY;
const bucketName = process.env.QINIU_TEST_BUCKET;
const mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
const config = new qiniu.conf.Config();
const bucketManager = new qiniu.rs.BucketManager(mac, config);
// ....
class HomeController extends Controller {
// ...
async list() {
const { ctx } = this;
const options = {
limit: 10,
prefix: '123/',
};
return new Promise((resolve, reject) => {
bucketManager.listPrefix(bucketName, options, (err, respBody, respInfo) => {
if (err) {
reject(err);
return;
}
console.log(respInfo);
if (respInfo.statusCode !== 200) {
ctx.throw(500, 'Internal Server Error');
reject(new Error(`status: ${respInfo.statusCode}`));
return;
}
console.log(respBody.items);
ctx.body = {
data: respBody.items,
}
resolve();
});
});
}
}
- 修改 router.js
router.get('/list', controller.home.list); // 新增
npm run dev
- 在浏览器访问对应地址
运行结果:
![image](https://private-user-images.githubusercontent.com/17806506/280180553-d1197d95-e81c-45e9-ab57-8f4ad11ceb43.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDQzNzU5MzMsIm5iZiI6MTcwNDM3NTYzMywicGF0aCI6Ii8xNzgwNjUwNi8yODAxODA1NTMtZDExOTdkOTUtZTgxYy00NWU5LWFiNTctOGY0YWQxMWNlYjQzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDAxMDQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwMTA0VDEzNDAzM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWYxNDRiMmM5MGJiNjdlN2FiM2UyN2RiZDY0YTIxYjU3N2Y5ODc2MGUyYWRkMzFkNWYyMGRjZmE0MzQzNDFjMDYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.PeNMzCsAFsjv7WzfklEmLqfUBurDTvH2PAY07TXXXys)
既然已经使用 aync 函数,建议包装 Promise 时使用 await 操作:
async list() {
const { ctx } = this;
const options = {
limit: 10,
prefix: '123/',
};
const {
err,
respBody,
respInfo,
} = await new Promise(resolve => {
bucketManager.listPrefix(bucketName, options, (err, respBody, respInfo) => {
resolve({ err, respBody, respInfo });
});
});
if (err) {
ctx.throw(500, new Error('internal err'));
console.log(err, respInfo);
return;
}
if (!respInfo || respInfo.statusCode !== 200) {
ctx.throw(500, new Error('internal err'));
console.log(err, respInfo);
return;
}
ctx.body = {
data: respBody.items,
};
}
若您有更多问题,请继续评论。另外,请考虑您是否使用了代理,导致域名解析到了错误的 IP 地址。
from nodejs-sdk.
@A-birdFlyHigner 未能复现。
您提供的 zip 没有包含七牛的代码。
以下是基于您的 zip 修改,可正常工作的代码。
- 安装 qiniu 包,例如
npm install qiniu
- 修改 home.js
const qiniu = require('qiniu'); const { Controller } = require('egg'); // 仅作演示,请根据实际需求选择合适的位置获取 bucketManager const accessKey = process.env.QINIU_ACCESS_KEY; const secretKey = process.env.QINIU_SECRET_KEY; const bucketName = process.env.QINIU_TEST_BUCKET; const mac = new qiniu.auth.digest.Mac(accessKey, secretKey); const config = new qiniu.conf.Config(); const bucketManager = new qiniu.rs.BucketManager(mac, config); // .... class HomeController extends Controller { // ... async list() { const { ctx } = this; const options = { limit: 10, prefix: '123/', }; return new Promise((resolve, reject) => { bucketManager.listPrefix(bucketName, options, (err, respBody, respInfo) => { if (err) { reject(err); return; } console.log(respInfo); if (respInfo.statusCode !== 200) { ctx.throw(500, 'Internal Server Error'); reject(new Error(`status: ${respInfo.statusCode}`)); return; } console.log(respBody.items); ctx.body = { data: respBody.items, } resolve(); }); }); } }
- 修改 router.js
router.get('/list', controller.home.list); // 新增
npm run dev
- 在浏览器访问对应地址
运行结果:
既然已经使用 aync 函数,建议包装 Promise 时使用 await 操作:
async list() { const { ctx } = this; const options = { limit: 10, prefix: '123/', }; const { err, respBody, respInfo, } = await new Promise(resolve => { bucketManager.listPrefix(bucketName, options, (err, respBody, respInfo) => { resolve({ err, respBody, respInfo }); }); }); if (err) { ctx.throw(500, new Error('internal err')); console.log(err, respInfo); return; } if (!respInfo || respInfo.statusCode !== 200) { ctx.throw(500, new Error('internal err')); console.log(err, respInfo); return; } ctx.body = { data: respBody.items, }; }若您有更多问题,请继续评论。另外,请考虑您是否使用了代理,导致域名解析到了错误的 IP 地址。
这有个测试仓库
https://github.com/A-birdFlyHigner/test-egg
from nodejs-sdk.
@A-birdFlyHigner
这个 404 是您的 notFoundHandler
中间件没拿到 ctx.body
返回的,与七牛无关。您的代码没有设置 ctx.body
请按以下步骤修改您的业务逻辑:
请参考上面的代码修改 QiniuService
的 getFileListByBucketAndPrefix
使其返回文件列表。
修改 QiniuController
的 getFileListByBucketAndPrefix
使其为 async 函数,并通过 await 获取 QiniuService
的 getFileListByBucketAndPrefix
的结果。最后将结果写入到 ctx.body
中。
from nodejs-sdk.
@A-birdFlyHigner 这个 404 是您的
notFoundHandler
中间件没拿到ctx.body
返回的,与七牛无关。您的代码没有设置ctx.body
请按以下步骤修改您的业务逻辑:请参考上面的代码修改
QiniuService
的getFileListByBucketAndPrefix
使其返回文件列表。修改
QiniuController
的getFileListByBucketAndPrefix
使其为 async 函数,并通过 await 获取QiniuService
的getFileListByBucketAndPrefix
的结果。最后将结果写入到ctx.body
中。
其实在listPrefix的回调里面,已经和返回给我404了。我在Controller里面已经await了,建议的写法依旧不行
from nodejs-sdk.
@A-birdFlyHigner 您红框打印的是 ctx.body
,而 ctx.body
此时还未赋值,当然没有内容。您截图代码七牛返回的信息在 err
, respBody
, respInfo
这三个变量中。
from nodejs-sdk.
@A-birdFlyHigner 您红框打印的是
ctx.body
,而ctx.body
此时还未赋值,当然没有内容。您截图代码七牛返回的信息在err
,respBody
,respInfo
这三个变量中。但是实际上已经触发了notFoundHandler这个中间件,并且已经给我赋值并返回过了。。你们有没有提供 promise 的 api:
![]()
from nodejs-sdk.
@A-birdFlyHigner
Promise 风格的 API 是计划要做的,暂时还没有,十分抱歉。
试了一下,上面提供的封装方式在中间件下,也可以正常工作。应该是您自己的代码问题,请自行排查一下。
from nodejs-sdk.
@A-birdFlyHigner Promise 风格的 API 是计划要做的,暂时还没有,十分抱歉。 试了一下,上面提供的封装方式在中间件下,也可以正常工作。应该是您自己的代码问题,请自行排查一下。
吐。。。。到最后发现是jwt中间件没有await next() = =
感谢耐心解答
from nodejs-sdk.
Related Issues (20)
- 如何支持暂停/继续/取消上传操作
- 客户端上传blob和base64图片使用相同token,前者成功,后者401 HOT 1
- 添加视频水印接口似乎没有?
- bucketManager.listPrefix 查询结果不准确
- vulnerability in netmask (CVE-2021-28918)
- typescript sms 模块的声明文件没补全啊。。还得自己加 HOT 1
- 持久化数据处理中的 srcKey到底有何意义 HOT 1
- typescript中interface PutPolicyOptions中确实参数forceSaveKey
- 这个bug太坑了 元数据定义无法生效的问题 请修改 HOT 1
- 添加华东-浙江存储区域的 conf.Zone HOT 5
- [question] qhash如何在私有资源中使用 HOT 4
- 使用七牛 node 上传,第一次ok,连续两次,就报这个异常。 HOT 3
- 批量删除无法指定区域 HOT 3
- typescript 类型报错 'setObjectLifeCycle' HOT 1
- DeprecationWarning on node16 HOT 2
- 关于依赖npm包vm2的漏洞问题,请处理下? HOT 2
- [docuemnt] 类型文件和官网文档不全 HOT 1
- 需要完善内容审核相关API
- put没有执行回调方法
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from nodejs-sdk.