node.js - 处理快速管道中的错误
问题描述
我有一个小型 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
电话能让我离开那里。
对服务器端发生的错误做出差异化响应的优雅方法是什么?
解决方案
几个小时后,我似乎成功了:
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
在它自己的请求上监听。
推荐阅读
- angular - 从 Firebase 身份验证中删除用户
- rust - 如何编写一个不获取所有权(或不消耗)迭代器的函数?
- string - 替换字符串变量中的值 - Scala
- c - 我的 read_lines() 函数在调用时未按预期运行。有没有办法修复我当前的实现?
- javascript - 无法将选择元素动态添加到动态创建的
- python - tornado.ioloop.IOLoop.current().time() 不在我的时区,如何配置时区偏移?
- puppet - 如何使用 Puppet Facts API 获得正常运行时间百分比
- android - Wear OS Google Fit Recording API 订阅 DataType 错误 INVALID_ACCOUNT
- sql - 如何编写包含所有条件的 CASE 语句?
- angular - Angular:不同路线的依赖注入