【问题标题】:Sending response after fs.readFile has finished executing iteratively在 fs.readFile 完成迭代执行后发送响应
【发布时间】:2016-11-03 10:32:21
【问题描述】:

我有以下代码

var express = require('express');
var Promise = require('bluebird');
var fs = Promise.promisifyAll(require('fs'));
var path = require("path");
var langs = fs.readdirSync({directory having multiple directories});
var arr = [];
for(var v in langs){
    var filename = config.path.storage + "/" + langs[v] +"/assets/_assets.json";
        fs.readFile(filename, "utf8", function(err, data) {
        if (err) throw err;
        res.write(data);
        //res.end();
    });
}
res.end();

我想要做的是,一旦目录中的所有文件(在这种情况下为 lang - langs 包含:[ 'ar-dz', 'en-gb', 'en-us' ]) 被读取,我想做一个 res.send() 给客户端。

我试图通过“bluebird”模块来承诺“fs”模块。我假设 fs.readFileAsync() 中的回调导致了问题,有没有办法解决它?

【问题讨论】:

  • Becoz res.end() 将在任何 res.write 调用被执行之前被执行
  • 好的,我正在重新格式化代码.. 我理解为什么会出现 Can't set headers,但实际问题,正如标题所说,我需要一种方法来执行我的作品迭代执行 readFile() 后的代码

标签: node.js callback promise fs


【解决方案1】:

Can't set headers after they are sent. 发生是因为您在调用 res.end() 之后调用了 res.write()。发生这种情况是因为对 fs.readFile() 的异步响应在您的 for 循环完成后稍后出现。相反,您需要使用您的 Promise 来协调异步操作的结果,当它们都完成后,您可以发送包含所有数据的响应。

您可以使用您的 Bluebird Promise 库来执行此操作:

fs.readdirAsync(...).map(function(file) {
    return fs.readFileAsync(file, 'utf8');
}).then(function(arrayOfData) {
    res.send(arrayOfData.join(""));
}).catch(function(err) {
    // send some error response here
});

【讨论】:

    猜你喜欢
    • 2023-02-19
    • 2011-03-23
    • 1970-01-01
    • 2020-02-28
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多