Node.js中使用Bluebird promisifyAll改造readFile遇类型错误求助
问题解决:Bluebird promisifyAll 后 readFile 报错 TypeError [ERR_INVALID_CALLBACK]
错误原因
用Promise.promisifyAll包装fs模块时,不会覆盖原有的回调式方法,而是会给每个异步方法生成一个带Async后缀的Promise版本。你现在调用的还是原生fs.readFile,它要求最后一个参数必须是回调函数,但你传了"utf8",自然触发回调无效的错误。
另外,Promise的then回调只接收成功状态的返回值,错误应该用catch来捕获,你原来把err放在then参数里的写法是错误的。
修正后的代码
var express = require('express'); var app = express(); var Promise = require("bluebird"); var fs = Promise.promisifyAll(require("fs")); app.get('/users', function(req,res) { // 使用带Async后缀的Promise版本方法 fs.readFileAsync("./users.json", "utf8") .then(function(data) { data = JSON.parse(data); res.send(data); }) // 捕获文件读取错误和JSON解析错误 .catch(function(err) { if (err.code === 'ENOENT' || err.message.includes('read')) { console.error("unable to read file..."); } else if (err instanceof SyntaxError) { console.error("invalid json file"); } // 给客户端返回错误响应,避免请求挂起 res.status(500).send("Server error"); }); }); app.listen(3000,function(){ console.log("listening on port 3000"); });
关键改动点
- 将
fs.readFile替换为fs.readFileAsync:这是Bluebird promisifyAll生成的Promise兼容方法 - 重构错误处理逻辑:把所有错误(文件读取失败、JSON解析失败)统一放到
catch块中处理,同时给客户端返回错误状态码,避免请求一直处于挂起状态
内容的提问来源于stack exchange,提问作者sudar
相关产品推荐
相关产品推荐

