【发布时间】:2026-02-06 12:35:01
【问题描述】:
我有下面的代码,它正在读取一个大小约为 600mb 的大型 XML 文件并返回以下输出:
Total Number of Lines in File: 12077214
Read in 3774.015ms
代码:
var express = require("express");
var router = express.Router();
var fs = require("fs");
var es = require("event-stream");
var now = require("performance-now");
router.get("/testapi", function (req, res, next) {
var totalLines = 0;
var t0 = now();
var t1;
fs.createReadStream("./large_xml_test.xml")
.pipe(es.split())
.pipe(
es
.mapSync(function (line) {
if (line != "") {
totalLines++;
}
})
.on("error", function (err) {
console.log("Error while reading file.", err);
})
.on("end", function () {
console.log("Read entire file.");
t1 = now();
console.log("Total Number of lines: ", totalLines);
console.log(
`Performance now line count timing: ` + (t1 - t0).toFixed(3) + `ms`
);
res.send(
`Total Number of Lines in File: ${totalLines.toString()}<br/>Read in ${(
t1 - t0
).toFixed(3)}ms`
);
})
);
});
module.exports = router;
我尝试使用 async 和 awaits 关键字将其移至单独的函数,但使用 res.send 时不显示结果,即调用 API 但立即返回 200 并且没有发生等待?
似乎控制台日志函数仅在 vs 代码中触发,但仅此而已,有没有办法将此函数移动到单独的文件并让 res.send 等待返回值?
感谢目前正在学习nodejs。
=================== 编辑===================
在回答 Keiths 的声明时,这是我测试但失败的最后一项:
文件 1:
var express = require("express");
var router = express.Router();
const test = require("../functions/readFileEventStream");
router.get("/testapi", function (req, res, next) {
let message = "API is working properly";
const results = (async function () {
await test.readLargeFile();
})();
res.send(results);
});
module.exports = router;
文件 2
var fs = require("fs");
var es = require("event-stream");
var now = require("performance-now");
var totalLines = 0;
var t0 = now();
var t1;
async function readLargeFile() {
fs.createReadStream("./large_xml_test.xml")
.pipe(es.split())
.pipe(
es
.mapSync(function (line) {
if (line != "") {
totalLines++;
}
})
.on("error", function (err) {
console.log("Error while reading file.", err);
})
.on("end", function () {
t1 = now();
var msg = `Total Number of Lines in File: ${totalLines.toString()},\r\nRead in ${(
t1 - t0
).toFixed(3)}ms`;
return msg;
})
);
}
module.exports = {
readLargeFile,
};
【问题讨论】:
-
是的,你可以把这个逻辑包装到一个 Promise 构造函数中,然后你可以在你的路由中等待它。如果您显示您尝试拆分的代码可能是最好的,然后我们可以解释如何修复。
-
@Keith 我已经添加了我尝试过的测试代码还有其他尝试但我覆盖了它们这是最后一个。
-
查看 Edwards 的回答,它向您展示了如何将基于事件的回调转换为 Promise 构造函数,然后您可以稍后等待。
标签: javascript node.js express