Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在流完成管道后呈现响应?_Node.js_Koa - Fatal编程技术网

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

Node.js 如何在流完成管道后呈现响应?,node.js,koa,Node.js,Koa,这就是我想要的,服务器是一个文件服务器,当客户端请求某个文件时,它会将该文件流回。我尝试这样做,而不是koi static,但是dest.jpg只包含'notfound' 客户端代码: var Koa = require('koa'); var Router = require('koa-router'); const HttpStatus = require('http-status'); const fs = require('fs'); const koaBody = require('k

这就是我想要的,服务器是一个文件服务器,当客户端请求某个文件时,它会将该文件流回。我尝试这样做,而不是koi static,但是dest.jpg只包含'notfound'

客户端代码:

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,外观相同

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

好的,我添加了异步,现在可以工作了

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);

我想我错过了等待的承诺。