thinkjs / thinkjs

Use full ES2015+ features to develop Node.js applications, Support TypeScript.
https://thinkjs.org/
MIT License
5.31k stars 616 forks source link

controller里调用阿里云oss接口无法返回数据,总是返回一个ok #1518

Closed DickyNet closed 4 years ago

DickyNet commented 4 years ago

DESC

我在调用阿里云的oss sdk时,遇到如下问题,无论是用回调方式,还是await方式调用,页面都是返回一个OK,而不是返回拼接的数据。 官方接口说明:https://help.aliyun.com/document_detail/111389.html?spm=a2c4g.11186623.6.1423.7abe4fdeBQBlnj oss接口是支持await方式调用的

ENV

OS Platform: windows Node.js Version: 12.0+ ThinkJS Version: 3.0+

code

// your code here

const OssClient = require('ali-oss');
module.exports = class extends Base {
        //回调方式调用sdk接口
    async indexAction() {
        const ossClient = new OssClient({
          bucket: 'xxx',
          region: 'xxx',
          accessKeyId: 'xxx',
          accessKeySecret: 'xxx'
        });
        const list = [];
        ossClient.list().then((ossResult) => {
            // log.info(ossResult);
            // log.info(ossResult.objects);
            if (ossResult.res.status === 200 && ossResult.objects && ossResult.objects.length > 0) {
              for (let j = 0; j < ossResult.objects.length; j++) {
                list.push({url: ossResult.objects[j].name});
              }
            }
            log.info(list);
            const total = list.length;
            return this.json({
              'state': 'SUCCESS',
              'list': list,
              'start': 1,
              'total': total
            });
        });
    }
        // await方式调用oss接口
    async listAction() {
        const ossClient = new OssClient({
          bucket: 'xxx',
          region: 'xxx',
          accessKeyId: 'xxx',
          accessKeySecret: 'xxx'
        });
        const list = [];
        const ossResult = await ossClient.list();
        // log.info(ossResult);
        // log.info(ossResult.objects);
        if (ossResult.res.status === 200 && ossResult.objects && ossResult.objects.length > 0) {
          for (let j = 0; j < ossResult.objects.length; j++) {
            list.push({url: ossResult.objects[j].name});
          }
        }
        log.info(list);
        const total = list.length;
        return this.json({
          'state': 'SUCCESS',
          'list': list,
          'start': 1,
          'total': total
        });
    }
}

// your detail description 怎么才能正常返回拼接的json数据呢?

lizheming commented 4 years ago

返回 OK 是表示服务端没有返回任何内容,https://zhuanlan.zhihu.com/p/34220232 看一下这篇文章最后“问题”部分的内容你应该能懂。理论上 listAction() 应该可是可以返回的,如果没有返回那就是你没命中这个路由逻辑,具体可以参照 https://thinkjs.org/zh-cn/doc/3.0/router.html#toc-54f 文档说明调试一下。

zhangbowy commented 4 years ago

listAction 看着都没问题 image

zhangbowy commented 4 years ago

image

image

没正确响应才返回 ok 啊 非要这样写的话 加个await 啊

DickyNet commented 4 years ago

返回 OK 是表示服务端没有返回任何内容,https://zhuanlan.zhihu.com/p/34220232 看一下这篇文章最后“问题”部分的内容你应该能懂。理论上 listAction() 应该可是可以返回的,如果没有返回那就是你没命中这个路由逻辑,具体可以参照 https://thinkjs.org/zh-cn/doc/3.0/router.html#toc-54f 文档说明调试一下。

但是后可以打印出接口里有内容啊(log.info(ossResult.objects)

zhangbowy commented 4 years ago

返回 OK 是表示服务端没有返回任何内容,https://zhuanlan.zhihu.com/p/34220232 看一下这篇文章最后“问题”部分的内容你应该能懂。理论上 listAction() 应该可是可以返回的,如果没有返回那就是你没命中这个路由逻辑,具体可以参照 https://thinkjs.org/zh-cn/doc/3.0/router.html#toc-54f 文档说明调试一下。

但是后可以打印出接口里有内容啊(log.info(ossResult.objects)

异步的啊 亲

zhangbowy commented 4 years ago

返回 OK 是表示服务端没有返回任何内容,https://zhuanlan.zhihu.com/p/34220232 看一下这篇文章最后“问题”部分的内容你应该能懂。理论上 listAction() 应该可是可以返回的,如果没有返回那就是你没命中这个路由逻辑,具体可以参照 https://thinkjs.org/zh-cn/doc/3.0/router.html#toc-54f 文档说明调试一下。

但是后可以打印出接口里有内容啊(log.info(ossResult.objects)

异步的啊 亲

oss那个方法还是会异步执行呀 你的哪里没等待就往下执行了 下面啥也没有 空空如也 没正确响应 就 ok了 image

image

DickyNet commented 4 years ago

返回 OK 是表示服务端没有返回任何内容,https://zhuanlan.zhihu.com/p/34220232 看一下这篇文章最后“问题”部分的内容你应该能懂。理论上 listAction() 应该可是可以返回的,如果没有返回那就是你没命中这个路由逻辑,具体可以参照 https://thinkjs.org/zh-cn/doc/3.0/router.html#toc-54f 文档说明调试一下。

但是后可以打印出接口里有内容啊(log.info(ossResult.objects)

异步的啊 亲

oss那个方法还是会异步执行呀 你的哪里没等待就往下执行了 下面啥也没有 空空如也 没正确响应 就 ok了 image

image

const ossResult = await ossClient.list(); 我这样等待调用,按理说应该能返回内容的。但是没有输出json

DickyNet commented 4 years ago

返回 OK 是表示服务端没有返回任何内容,https://zhuanlan.zhihu.com/p/34220232 看一下这篇文章最后“问题”部分的内容你应该能懂。理论上 listAction() 应该可是可以返回的,如果没有返回那就是你没命中这个路由逻辑,具体可以参照 https://thinkjs.org/zh-cn/doc/3.0/router.html#toc-54f 文档说明调试一下。

但是后可以打印出接口里有内容啊(log.info(ossResult.objects)

异步的啊 亲

indexAction我是在异步回调里(.then)里拼接json的啊

lizheming commented 4 years ago
curl http://127.0.0.1:8002/index/list

对着 listAction 说你用 async/await 了,然后调的 indexAction,答应我别在 issue 里再犯这种低级错误了好么…

DickyNet commented 4 years ago
curl http://127.0.0.1:8002/index/list

对着 listAction 说你用 async/await 了,然后调的 indexAction,答应我别在 issue 里再犯这种低级错误了好么…

indexAction和listAction 2种方式都不行啊,没明白你的意思

zhangbowy commented 4 years ago

返回 OK 是表示服务端没有返回任何内容,https://zhuanlan.zhihu.com/p/34220232 看一下这篇文章最后“问题”部分的内容你应该能懂。理论上 listAction() 应该可是可以返回的,如果没有返回那就是你没命中这个路由逻辑,具体可以参照 https://thinkjs.org/zh-cn/doc/3.0/router.html#toc-54f 文档说明调试一下。

但是后可以打印出接口里有内容啊(log.info(ossResult.objects)

异步的啊 亲

oss那个方法还是会异步执行呀 你的哪里没等待就往下执行了 下面啥也没有 空空如也 没正确响应 就 ok了 image image

const ossResult = await ossClient.list(); 我这样等待调用,按理说应该能返回内容的。但是没有输出json

那返回了什么 500页面吗 你这个list应该是没问题的 建议debugger看一下 或者 try catch 一下

image image

DickyNet commented 4 years ago

不好意思,是我搞错了,实际代码里我在另一个Action里调用了其它Action 没有 return,如下: async homeAction() { this.idnexAction(); }