koa2源码阅读的一点问题

发布于 2022-09-06 12:23:39 字数 577 浏览 18 评论 0

在阅读koa2的源码过程中,读到了application里面的一个callback方法,因为这个方法是返回createServer所需要的回调函数的,就对其中的一句代码感到了不理解,就是handleRequest里面为什么需要return this.handleRequest(ctx, fn)呢。不return直接执行好像也没有问题

    callback() {
        const fn = compose(this.middleware);

        if (!this.listeners('error').length) this.on('error', this.onerror);

        const handleRequest = (req, res) => {
            const ctx = this.createContext(req, res);
            return this.handleRequest(ctx, fn);
        };

        return handleRequest;
    }

有懂的大神帮忙解答下吗,多谢了!

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

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

发布评论

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

评论(3

彻夜缠绵 2022-09-13 12:23:39

结论:在绝大多数情况下,这个return是没有任何实际作用的,除了一些特殊的场景,比如从express迁移到koa。

看具体例子:

const http = require('http');
const koa = require('koa');
const koaApp = new koa();

koaApp.use(async ctx => {
  ctx.body = 'call api';
});

const koaCallback = koaApp.callback();

const express = require('express');
const expressApp = express();

expressApp.use('/api', (req, res, next) => {
  koaCallback(req, res)
    .then(() => {
      console.log('api is called');
    })
});

expressApp.listen(3000);

return this.handleRequest(ctx, fn)返回了promise实例,方便开发者后续的操作(在请求处理完成之后)。

当然,上面的例子因为比较简单,不一定要用.then()也能实现。只不过返回Promise实例,编码起来会方便很多。

比如你想在koa处理完请求后做一些事情,如果没有return的话,你需要些一些比较恶心繁琐的代码来判断请求是否已经处理完。

甜扑 2022-09-13 12:23:39

这里的this.handleRequest指的不是上面刚定义的handleRequest,而是ApplicationhandleRequest方法。

 handleRequest(ctx, fnMiddleware) {
    const res = ctx.res;
    res.statusCode = 404;
    const onerror = err => ctx.onerror(err);
    const handleResponse = () => respond(ctx);
    onFinished(res, onerror);
    return fnMiddleware(ctx).then(handleResponse).catch(onerror);
  }

https://github.com/koajs/koa/...

至于作用,大概是返回一个promise,依次调用之前传递的中间件,同时带有一个默认的错误处理中间件

无风消散 2022-09-13 12:23:39

看return有没有作用看调用的地方
createServer是不需要返回值的

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