0

这是代码:

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 请求一起加载和执行,但我不明白为什么它们会混在一起。我的代码有什么问题?任何帮助将不胜感激。谢谢你。

4

1 回答 1

0

是的,当使用异步代码时,您不能将唯一函数分配给全局变量,然后期望正确的异步操作从全局变量中获取正确的唯一函数。您的代码不会同步运行,因此您无法将某些内容放入共享变量中,然后知道正确的内容将在正确的时间出现并且未被覆盖。这只是一个糟糕的设计,永远不会可靠。

在 Express 架构的服务器中,为每个请求创建一个唯一的request对象response,并且至少响应对象通常会被传递,直到响应完成(因为需要它来做出响应)。如果您需要一个地方来存储特定于该特定请求的数据,那么您可以将自己的自定义属性添加到responseorrequest对象,这样您就可以避免两个请求在重叠时间范围内运行的问题,因为异步操作可能会影响彼此的状态.

我不完全遵循您的代码,但由于您似乎正在传递response对象,您可以在响应对象上放置一个独特的函数,然后从那里调用它。但更好的方法是将您的唯一数据与响应对象一起传递,而不是每次都创建一个新函数。

我看到的其他问题:

  1. 您通过多次创建多个app对象var app = express();。这很少是正确的实现。您通常只想创建一个app对象,并且应该是您调用app.listen(80)的对象。

  2. 您的单字母变量名称使您的代码更难让不知道您的代码的人立即理解它。请使用描述性和有意义的变量名。这不是一个尝试保存几个字节的地方。

  3. 第一个论点global.make_reply()应该是什么?当您定义该函数时,您使它看起来像一个具有.header()and.send()方法的响应对象。但是,当你调用它时gateway.js,你传递一个字符串作为第一个参数。在您编写代码时,我看不出这可能如何工作。

于 2016-05-05T02:18:34.623 回答