【发布时间】:2022-11-03 22:48:58
【问题描述】:
我在 Express.js 中创建了一个简单的网络服务器。服务器提供通过处理来自第三方 API 的数据而动态创建的文件。
这是我的网络服务器代码,它请求builder.js 构建文件,该文件通过await根据需要响应承诺的oauth 请求来请求、接收、处理和返回来自第三方API 的数据。构建器将至少调用 API 两次或更多次以创建一个完整的文件以供服务。
const express = require('express');
const app = express();
const builder = require('./builder.js');
let requestID = 0;
app.get('/', function (req, res) {
requestID++;
console.log(`tab: ${requestID}<`);
res.set('Content-Type', 'text/plain; charset=UTF-8')
res.status(200).send('Hello World');
console.log(`tab: ${requestID}>`);
});
app.get('/file', async function (req, res) {
requestID++;
console.log(`tab: ${requestID}<`);
if (req.query["id"] != undefined) {
let URLparams = new URLSearchParams(req.query);
console.log(`tab: ${requestID}, requested id: ${URLparams.get("id")}`);
let output = await builder.buildFile(URLparams);
try {
console.log(`tab: ${requestID}, requested id: ${URLparams.get("q")}, served ${getIDfromOutput(output)}`);
res.set('Content-Type', 'application/rss+xml; charset=UTF-8')
res.status(200).send(output);
} catch(e) {
console.log(`tab: ${requestID}, ${e}`);
if (e instanceof String) { res.send(JSON.stringify(JSON.parse(e), null, 3)); }
else { res.send(JSON.stringify(e, null, 3)); }
};
} else {
res.set('Content-Type', 'text/plain; charset=UTF-8')
res.status(404)
.send("404: Page not found.");
}
console.log(`tab: ${requestID}>`);
});
app.listen(3000, "localhost");
当一次向/file 发出请求时,代码按预期工作。
//1 tab loaded
tab: 1<
tab: 1, requested: 1331444331778101248
tab: 1, requested: 1331444331778101248, loaded 1331444331778101248
tab: 1>
但是,当请求多个端点时独特的同时请求(同时打开多个选项卡或运行并行wget 命令),服务器在某些情况下要么正确响应,但它主要响应之前提供的相同文件。
// 5 unique tabs loaded at the same time: 1551641441679597569, 1448115610173558787, 1370689539505860613, 1328121208022446086, 1509637745140019212
tab: 1<
tab: 1, requested: 1551641441679597569
tab: 2<
tab: 2, requested: 1448115610173558787
tab: 2, requested: 1551641441679597569, loaded 1551641441679597569
tab: 2>
tab: 3<
tab: 3, requested: 1370689539505860613
tab: 3, requested: 1448115610173558787, loaded 1448115610173558787
tab: 3>
tab: 3, requested: 1370689539505860613, loaded 1370689539505860613
tab: 3>
这些同时请求的结果导致选项卡 1-4 加载正常,但选项卡 5 显示选项卡 4 的输出。控制台记录器似乎也无法显示问题,但它绝对不同于正常的一次性请求。
我不希望这种情况发生,因为我担心这可能会在生产中发生,并且我不希望输出在请求之间泄露。但是,我不知道是什么原因造成的,也不知道如何调查以解决此问题。当 builder.buildFile() 必须对第三方进行一次 API 调用时,代码工作正常,但我总是进行 2 次或更多次调用。
【问题讨论】:
-
你能分享一下buildFile函数吗?看来您在这里有两个不同的问题,一个是您看到混淆的 console.log,另一个是未按预期提供的文件。 console.log 问题很容易修复,但未提供的文件可能在 buildFile 函数中,而不是在此函数中。
标签: javascript node.js api express webserver