Nodejs - Koa2返回结果过程可以为异步

Koa2中返回结果函数可包含异步过程,如果使用nodejs版本大于8,可以使用Async/Await;如果nodejs版本较低,函数也可以返回Promise,结果也能正确返回。

如果用户请求中没有异步的操作,当然这很少见,和其它语言中的过程没有区别,但不涉及异步的过程貌似在Nodejs中没有什么卵用,例如:

const Koa = require("koa");
const app = new Koa();
const Router = require("koa-router");
const router = new Router();

app.use(router.routes());

router.post(ctx => {
  return 234 * 123;
});

app.listen(2333, () => { });

是没什么卵用,原因是在涉及I/O的操作,如对数据库、文件等的操作,在Nodejs中是异步的,而顺序执行返回的结果有很大可能是不对的。例如上传文件,考虑到如果用户可能上传较大文件,我们一般采用流写入保存文件,否则需要将所有客户端传来的文件接受完毕并全部读入内存,再开始写入,如果并发量大一些,系统就离着崩溃不远了。因此我们需要等待文件流全部保存,才能返回结果。

要做到这一点,我们可以使用Async/Await,但需要封装流写入过程为Promise。如下:

function asyncRes() {
    return new Promise((resolve, reject) => {
        file.pipe(fs.createWriteStream(‘target.png’));
           file.on(‘close’, err => {
            if (err) {
               reject({msg: ‘fail’})
            }
            resolve({msg: ‘success’})
        })
    }
}

接下来,在router中调用该函数。

const Koa = require("koa");
const app = new Koa();
const Router = require("koa-router");
const router = new Router();

app.use(router.routes());

router.post(async (ctx) => {
  await asyncRes();
});

app.listen(2333, () => { });

你可能感兴趣的:(Nodejs - Koa2返回结果过程可以为异步)