代码之家  ›  专栏  ›  技术社区  ›  user3552178

如何在流完成管道后呈现响应?

  •  0
  • user3552178  · 技术社区  · 8 年前

    这就是我想要的,服务器是一个文件服务器,当客户端请求某个文件时,它会将该文件流回。我尝试这样做,而不是koi静态,但是dest。jpg仅包含“未找到”。

    客户端代码:

    var Koa = require('koa');
    var Router = require('koa-router');
    const HttpStatus = require('http-status');
    const fs = require('fs');
    const koaBody = require('koa-body');
    const request = require('request');
    
    const tempSaveFile = fs.createWriteStream('dest.jpg');
    
    const writeStream = request.post('http://localhost:3456/getfile/src.jpg').pipe(tempSaveFile);
    writeStream.on('finish', () => {
        tempSaveFile.end();
        console.log('Upload successful! ');
    });
    

    服务器代码:

    var Koa = require('koa');
    var Router = require('koa-router');
    const HttpStatus = require('http-status');
    const fs = require('fs');
    const koaBody = require('koa-body');
    
    var app = new Koa();
    var router = new Router();
    const serve = require('koa-static');
    
    router
        .post([`/getfile/:fileName`],
            (ctx) => {
                const { params: { fileName } } = ctx;
                console.error(`------- server will return ${fileName} --------`);
    
                const readStream = fs.createReadStream(fileName).pipe(ctx.res);
    
                readStream.on('finish', () => {
                    console.error('---- server finished stream ----');
                    ctx.status = HttpStatus.OK;
                });
            })
    
    app.use(router.routes());
    app.use(router.allowedMethods());
    
    app.listen(3456);
    

    当我将服务器更改为使用koa static时,客户端可以成功地获取文件,did diff,外观相同。

    我怀疑服务器在完成之前返回得太快,但另一篇帖子说这是等待管道完成的方式。 callback to handle completion of pipe 有什么建议吗?谢谢

    1 回复  |  直到 8 年前
        1
  •  1
  •   user3552178    8 年前

    好的,我添加了异步,正在工作

    const multiparty = require('multiparty');
    const multer = require('koa-multer');
    const request = require('request');
    
    var app = new Koa();
    var router = new Router();
    const serve = require('koa-static');
    
    const streamEnd = fd => new Promise((resolve, reject) => {
        fd.on('end', () => {console.error('-- 51 --'); resolve(51); });
        fd.on('finish', () => {console.error('-- 53 --'); resolve(53); });
        fd.on('error', reject);
    });
    
    router
        .get([`/getfile/:fileName`],
            async (ctx) => {
                const { params: { fileName } } = ctx;
                console.error(`------- server will return ${fileName} --------`);
    
                if (fs.existsSync(fileName)) {
                    const readStream = fs.createReadStream(fileName).pipe(ctx.res);
                    await streamEnd(readStream);
    
                    ctx.status = HttpStatus.OK;
                } else {
                    console.error(`File ${fileName} doesnot exist`);
                    ctx.status = HttpStatus.INTERNAL_SERVER_ERROR;
                }
            })
    
    app.use(serve('./customer'));
    app.use(router.routes());
    app.use(router.allowedMethods());
    
    app.listen(3456);
    
    推荐文章