Node Express可根据要求挂起

时间:2016-09-22 21:06:38

标签: angularjs node.js express

这是一个棘手的问题;我无法确切地指出我的问题来自哪里,但我已经在mac和windows上重现了。

我有一个与webpack捆绑在一起的Angular 2站点,它通过节点为我的开发环境使用快速服务器。我的网站会加载,但有一次会有一个json文件/docs/package.json的http get请求挂起' pending'。它永远不会通过,最终会失败而没有错误。

有趣的事情:

  • 我的所有同事都让该项目在同一次提交中工作。

  • Angular会在拨打电话之前立即触发console.log,但它永远不会到达回叫。因此,我已经排除了Angular作为根本原因,因为在网络面板中,请求发生但响应永远不会到来。

相关的代码段是:

init() {
    this.onReadyPromise = new Promise((resolve, reject)=> {
    console.log('This log will fire'); 
    this.http.get(`${this.constants['BASE_RESOURCES_PATH']}/${this.constants['JSON_FILE_NAME']}`)
            .map(res => res.json())
            .subscribe(
                console.log('This log will NOT fire'); 
                response => {
                    this.parseDocsJson(response)
                        .then(()=> resolve(this.docs));
                },
                err => reject(err)
            );
    });
    return this.onReadyPromise;
}
  • 我重新安装了我的依赖项,包括吹掉我的node_modules目录。
  • 我已将整个存储库吹走并重新拉出,并重新安装了所有deps。同样的问题。
  • 我删除了节点和nvm,重新安装,修复了repo并将repo重新安装到另一个文件夹中。同样的问题。
  • 我尝试修改/etc/hosts以查看别名localhost是否有帮助。没用。
  • 我在节点版本5.8.05.10.06.3.0上尝试了这一点,所有版本都是多个同事尝试并成功完成的。没用。
  • 我已经从终端运行命令以及Intellij中的内置终端。没用。
  • 我没有更改任何代码。我昨天下班时这个项目工作正常。
  • 我在快递中的多个不同端口上尝试过它。
  • MacOS一夜之间更新。不确定这是否会产生影响。
  • 此项目还有一个python服务器,python服务器工作正常,这意味着这不太可能是与端口相关的问题。
  • 此问题在Chrome,Safari和Firefox中仍然存在。

我怀疑这是node / express的一个问题,因为webpack似乎捆绑了python版本完全正常,而Angular也可以通过python服务器工作。

我希望我能为所有可能提供帮助的人提供有关我的服务器配置的更多信息,但这是我现在所拥有的:

server.dev.js:

const express = require('express');
const webpack = require('webpack');
const WebpackDevServer = require('webpack-dev-server');

const config = require('./webpack.dev');
const helpers = require('./helpers');

const HOST = '0.0.0.0';
const PORT = 3000;

/**
 * Webpack Development Server configuration
 * Description: The webpack-dev-server is a little node.js Express server.
 * The server emits information about the compilation state to the client,
 * which reacts to those events.
 *
 * See: https://webpack.github.io/docs/webpack-dev-server.html
 */
const webpackDevServerOptions = {
    historyApiFallback: true,
    watchOptions: {
        aggregateTimeout: 300,
        poll: 1000
    },
    stats: {
        colors: true,
        errorDetails: true,
        cached: true,
        chunks: false
    },
    contentBase: helpers.root('src'),
    outputPath: helpers.root('dist'),
    proxy: {
        '/docs/**/*.html': {
            secure: false,
            bypass: function (req, res, proxyOptions) {
                if (req.headers.accept.indexOf('html') !== -1) {
                    return '/index.html';
                }
            }
        }
    }
};

var app = new WebpackDevServer(webpack(config), webpackDevServerOptions);

app.use('/docs/', express.static(helpers.root('../docs/')));

app.listen(PORT, HOST, function (err) {
    if (err) {
        throw err;
    }

    console.info(`Listening at http://${HOST}:${PORT}`);
});

更新

webpackDevServerOptions proxy导致问题。出于某种原因,每个请求都会触发正面。如果我在旁路功能中放置console.log,则会在以/docs/开头的所有请求中错误地触发。

我仍然不确定为什么globbing机制正在解析这个错误,但是一旦我发现它就会发回...

1 个答案:

答案 0 :(得分:0)

要回答我自己的问题,由于某种原因,节点通配符合/docs/的所有请求,无论它们是否包含.html扩展名,包括package.json。

由于我无法弄清楚为什么globbing在我的机器上出现故障,因此绑带修复是在旁路功能中if子句失败时返回请求URL:

proxy: {
    '/docs/**/*.html': {
        secure: false,
        bypass: function (req, res, proxyOptions) {
            if (req.headers.accept.indexOf('html') !== -1) {
                return '/index.html';
            }
            return req.url;
        }
    }
}

注意:我不喜欢。我更确切地说具有通配功能......我不知道我在网站的其他地方发现了什么,并且#34;修复"。如果有人对全球问题有所了解,我非常乐意将不同的答案标记为正确。但在那之前,就是这样。