【问题标题】:HTTP requests in Express NodeJSExpress NodeJS 中的 HTTP 请求
【发布时间】:2014-11-14 17:08:03
【问题描述】:

我有来自https://github.com/chjj/tty.js/的以下代码:

  this.get("/hola", function(res) {
    iniciar();
  });

  function iniciar() {
    self.init();
  }
  iniciar();

localhost:8080/hola,它没有加载。 localhost:8080 完美运行。 self.init() 调用一个函数,该函数又调用其他函数。问题似乎是以下调用函数:

Server.prototype.initMiddleware = function() {
  var self = this
    , conf = this.conf;

  this.use(function(req, res, next) {
    var setHeader = res.setHeader;
    res.setHeader = function(name) {
      switch (name) {
        case 'Cache-Control':
        case 'Last-Modified':
        case 'ETag':
          return;
      }
      return setHeader.apply(res, arguments);
    };
    next();
  });

  this.use(function(req, res, next) {
    return self._auth(req, res, next);
  });

  this.use(term.middleware());
  this.use(this.app.router);
  this.use(express.static(__dirname + '/../static'));
};

根据express.js 文档:

// a middleware sub-stack which prints request info for any type of HTTP request to /user/:id
app.use('/user/:id', function(req, res, next) {
  console.log('Request URL:', req.originalUrl);
  next();
}, function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});

因此,第一个 app.get 与其他 app.usethis.use 之间似乎存在“冲突”。我该如何解决?

【问题讨论】:

  • 您真的只想让localhost:8080/hola 的行为与localhost:8080/ 一样吗?您可以简单地将static/index.html 复制到static/hola 中,然后将索引文件复制到另一个文件中。 Express 服务器直接从/static 文件夹提供终端应用程序的静态 HTML;您正在修改的服务器端逻辑仅指定如何响应来自静态 HTML 客户端的请求,而不是如何将基本客户端代码发送到浏览器。
  • 为了帮助你理解你的实际问题,self.init()在这里设置了服务器端逻辑。基本上,您已经做到了,因此您需要在主页 (/) 工作之前访问 /hola,但访问 /hola 本身并没有做任何其他事情(除了使应用程序能够在全部)。只是这甚至不是真的,因为无论如何你已经在app.get('hola') 侦听器之外运行了self.init()(使用iniciar()),所以访问/hola 完全没有任何作用。
  • @apsillers,关于您的评论,您建议 this.get("/", function(res) {iniciar();}); 并在 app.get 之外删除 self.init 会起作用。但事实并非如此。
  • 执行以下操作:1. 将代码恢复原状(暂时)。您不需要更改服务器端逻辑来执行您想要执行的操作,并且可能会停止此表单的工作,直到您有一个可以确定工作的设置。 2.static/index.html 复制到一个新文件static/hola 中。 3. 在浏览器中加载localhost:8080/hola
  • 好的,@apsillers,它不起作用。我的目标是为这个应用程序设置一个更安全的登录,例如passportjs.org。因此,当登录成功时,我需要护照以使用get 重定向用户。

标签: javascript node.js http express


【解决方案1】:

这是因为你没有返回任何东西,然后浏览器正在轮询它,直到它返回一些东西。

this.app.get("/hola", function(req, res) {
    res.writeHead(200, {'content-type':'text/html'});
    res.end('/*html code here*/');
  });

【讨论】:

  • self.init()app.get(...) 之外调用时会返回很多东西。 self.init() 调用函数,而这些函数又调用其他函数。最后,我得到一个输出。问题是app.get 不起作用。
  • @user2979409 "self.init() 返回很多东西" 它没有,因为它没有 return 语句。它可能会在控制台上打印很多内容,或者执行许多其他副作用操作,但它不会return 任何东西。像self.init() 这样的函数表达式调用的值是被调用函数的return 值。
  • @apsillers,以及为什么我在浏览器中看到“打印”了一个 bash 控制台,如果它没有返回任何内容? (self.init 在外部调用app.get(...)。我想要的是调用self.init 或调用app.get('/', function() {self.init()}); 的相同输出
  • 我不同意。但我认为在这种情况下我看不到这些方法在做什么,因为你没有设置它们:if (this.conf.localOnly) this.initLocal(); this.initMiddleware(); this.initRoutes(); this.initIO();
  • @user2979409 函数的return 值与打印到控制台的副作用有什么关系?如果您不调用return,则没有定义return 值。您可以在函数中调用console.log,而不是在该函数中调用return。 (例如,定义一个函数:function foo() { console.log("I'm a log statement!"); } 然后调用它:var result = foo(); 当你记录result 的值时,注意它是undefined。返回值与函数所做的任何其他事情无关.)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 2012-03-23
  • 2019-06-26
  • 1970-01-01
相关资源
最近更新 更多