以下是代码:
FILE: server.js
var express = require('express'),
app = express(),
useragent = require('express-useragent'),
compression = require('compression'),
vhost = require('vhost');
app.use(vhost("blabla.com", 'app.js'));
app.disable('x-powered-by');
app.use(compression());
app.use(useragent.express());
app.listen(80);
FILE app.js
var useragent = require('express-useragent'),
express = require('express'),
sessao = require('express-session'),
armazenamento_ficheiros = require('session-file-store')(sessao),
compression = require('compression'),
app = express(),
favicon = require('serve-favicon');
global.uuid = require('uuid');
app.all('/u/my.json', function (req, res) {
var body = '';
p.on('data', function (d) {
body += d;
});
p.on('end', function () {
var g = require('./gateway');
g.e(body,res);
}, 'utf-8');
});
module.exports = app;
FILE:gateway.js
module.exports = {
e: function (body,res) {
//connects to database using data in body and send results to client....
res.header("Cache-Control", "no-cache, no-store, must-revalidate");
res.header("Pragma", "no-cache");
res.header("Expires", 0);
res.header('Last-Modified', (new Date()).toUTCString());
res.header("Content-type", "application/json; charset=utf-8");
res.send(JSON.stringify({"a":1}));
}
};
问题是,有时客户端会随机发出两个http请求,两个请求都会得到唯一的答复,而不是每个http请求都得到相应的答复。问题似乎是当其中一个http请求向数据库发出请求(导致获取答案的延迟)并在另一个请求中得到回复时。由于我发送了标头,所以会出现错误
我检查了gateway.js文件是否与每个http请求一起加载和执行,但我不明白为什么它们会混合在一起。我的代码出了什么问题?任何帮助都将不胜感激。非常感谢。
是的,当使用异步代码时,不能将唯一函数分配给全局变量,然后期望正确的异步操作从全局中获得正确的唯一函数。你的代码不是同步运行的,所以你不能把一些东西放进共享变量中,然后知道正确的东西会在正确的时间出现,而不会被覆盖。这只是一个糟糕的设计,永远不会可靠。
在Express体系结构的服务器中,为每个请求创建一个唯一的request
和response
对象,通常至少传递响应对象,直到响应完成(因为需要它来做出响应)。如果您需要一个位置来存储特定于此特定请求的数据,那么您可以将自己的自定义属性添加到response
或request
对象中,这样就可以避免由于异步操作而导致两个请求在重叠的时间框架中运行可能会影响彼此的状态的问题。
我没有完全遵循您的代码,但由于您似乎正在传递response
对象,因此可以在响应对象上放置一个唯一的函数,然后从那里调用它。但更好的方法是将您的唯一数据与响应对象一起传递,而不是每次都创建一个新函数。
我看到的其他问题:
-
通过多次执行
var app = express();
,可以创建多个app
对象。这很少是正确的实施。您通常只想创建一个app
对象,该对象应该是您在.上调用app.listen(80)
的对象 -
你的单字母变量名会让那些还不了解你的代码的人更难立即理解你的代码。请使用描述性和有意义的变量名。这不是一个试图保存几个字节的地方。
-
global.make_reply()
的第一个论点应该是什么?定义该函数时,会使其看起来像一个具有.header()
和.send()
方法的响应对象。但是,当您在gateway.js
中调用它时,您会传递一个字符串作为第一个参数。我看不出这怎么可能在你写代码的时候起作用。