解决koa-router无法返回异步获取mongo数据问题

发布于 2022-09-04 05:59:13 字数 1698 浏览 17 评论 0

//koaServer.js

var koa = require('koa');
var logger = require('koa-logger');
var router = require('koa-router')();
var cors = require('koa-cors');

var app = new koa();
//日志文件
app.use(logger());
//一键搞定跨域
app.use(cors());

router.get('/video', function*(next) {
        this.body = yield koaConnection(function (data) {
            return data;
        });
        yield next;
    });

app.use(router.routes()).use(router.allowedMethods());

app.listen(3000, () => {
    console.log('koa start!');
});

koaConnection封装了mongodb驱动,data是mongo查询后返回的结果。
前端页面测试/video接口返回错误:
Fetch API cannot load http://localhost:3000/video. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8888' is therefore not allowed access. The response had HTTP status code 500. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

这里应该是我用错了方法,调用接口后,this.body第一次什么都没拿到就返回了。所以前端接口报了500错误。

第一次接触koa和mongo,还不太懂generator函数,望大牛指点。最简单的需求,不管用回调,Promise,Genrator,Async还是co,能正确返回数据就好。

thx

----------------------------分割线----------------------------

想想可能是异步的问题,所以改写了下:

router.get('/video', function*(next) {
        this.body = yield new Promise(function (resolve, reject) {
            koaConnection(function (data) {
                resolve(data);
            });
        }).then(function (data) {
            return data;
        });
       // yield next;
    }

用Promise封装了下。测试接口返回了想要的结果。

于是(瞎猫碰到死耗子)混杂用Generator,Promise和回调函数搞定了需求。但是我搞不懂函数的运行逻辑。再次求大神指点。

thx

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

谢绝鈎搭 2022-09-11 05:59:13

前端报错是因为你跨域的部分没处理对,koa-cors配置得搞下。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文