【问题标题】:Express 4 middleware not calling routes on DigitalOcean serverExpress 4 中间件未在 DigitalOcean 服务器上调用路由
【发布时间】:2015-05-12 14:35:52
【问题描述】:

我正在使用 io.js 和 Express 4 创建 API,但我不知道为什么这不起作用。我目前正在 DigitalOcean 液滴(Ubuntu 14.04)上运行该程序,它没有调用 next() 方法,永远不会被调用/执行。该程序正在由带有 nginx 的反向代理路由到 https://<redacted>/asdf

var express = require('express');
var app = express();

var port = process.env.PORT || 3000;

var router = express.Router();

router.use(function(req, res, next) {
    console.log("Request received.");
    next();
});

router.post('/login', function(req, res) {
    console.log('Route /login accessed');
});

app.use('/', router);

app.listen(port);
console.log("Server started on port " + port + ".");

当我在我的 Droplet 上运行程序并向https://<redacted>/asdf/login 发送 POST 请求时,控制台会打印出“收到请求”,但不会打印出“已访问路由/登录”。奇怪的是,当一个帖子请求被发送到http://localhost:3000/login 时,这在我的本地机器上工作得很好。是不是我做错了什么,或者这是我不知道的已知事情?

【问题讨论】:

    标签: express nginx digital-ocean io.js


    【解决方案1】:

    Express 在映射路由时使用请求的 url 属性,我怀疑您的 nginx 反向代理没有从中删除 /asdf 根。如果是这样,您的 url 路径将是 /asdf/login,这将解释为什么您的 /login 后处理程序没有被调用。要测试这个假设,您可以尝试将反向代理根添加到您的 use,如下所示:

    app.use('/asdf', router);
    

    如果是这种情况,要解决这个问题,你可以像这样配置nginx为你重写url

    location  /asdf {
      rewrite /asdf(.*) $1  break;
      proxy_pass         http://localhost:3200;
      proxy_redirect     off;
      proxy_set_header   Host $host;
    }
    

    更多详情: https://serverfault.com/questions/379675/nginx-reverse-proxy-url-rewrite http://wiki.nginx.org/HttpRewriteModule#rewrite

    【讨论】:

    • 谢谢,这解决了问题。我也会为 nginx 应用这些更改。
    • 不应该是rewrite /asdf(.*) $1 break;没有斜线。这对我有用。
    猜你喜欢
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多