You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 18:46:06