koa2源码阅读的一点问题

在阅读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;
    }

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

阅读 2.3k
3 个回答

结论:在绝大多数情况下,这个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的话,你需要些一些比较恶心繁琐的代码来判断请求是否已经处理完。

这里的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,依次调用之前传递的中间件,同时带有一个默认的错误处理中间件

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题