首页 > 解决方案 > 处理快速管道中的错误

问题描述

我有一个小型 Web 服务,它基本上接收 PUT 并将有效负载保存到文件中。由于权限问题,文件写入可能会失败。我希望将其传达给客户。

为了更容易阅读,我将程序精简到最低限度。req.pipe 链在实际程序中要长得多。(有更多错误的可能性)

const fs = require('fs');
const express = require('express');
const app = express();

app.put('/write/:id', (req, res, next) => {
    const filename = 'data/' + req.params.id;
    console.log("write: " + filename);

    req 
        .pipe(fs.createWriteStream(filename))
        .on('error', next)
        
    req.on('end', () => {
        res.send('saved\n' );
        console.log("sent response");
    })
});

app.listen(8081, '0.0.0.0');

麻烦的是,无论我做什么,它总是会向客户端响应“已保存”。我有点希望那个next电话能让我离开那里。

对服务器端发生的错误做出差异化响应的优雅方法是什么?

标签: node.jsexpress

解决方案


几个小时后,我似乎成功了:

const fs = require('fs');
const express = require('express');
const app = express();

app.put('/write/:id', (req, res, next) => {
    const filename = 'data/' + req.params.id;
    console.log("write: " + filename);

    req 
        .pipe(fs.createWriteStream(filename))

        .on('error', (e) => {
            console.log("error ", e);
            res.status(400).send("failed");
        })
        
        .on('close', () => {
            res.send("saved\n");
        })      
});

app.listen(8081, '0.0.0.0');

请注意我是如何close在管道中监听的,而不是end在它自己的请求上监听。


推荐阅读