Express 4 中间件不调用 DigitalOcean 服务器上的路由

Express 4 middleware not calling routes on DigitalOcean server

我正在用 io.js 和 Express 4 创建一个 API,我不知道为什么这不起作用。我目前 运行 在 DigitalOcean droplet (Ubuntu 14.04) 上安装程序,它不会调用 next() 方法永远不会 called/executed。该程序正被 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 请求时,控制台打印出 "Request received" 但没有打印出 "Route /login accessed".奇怪的是,当 post 请求发送到 http://localhost:3000/login 时,这在我的本地机器上工作得很好。是我做错了什么,还是这是我不知道的已知事情?

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

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

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

location  /asdf {
  rewrite /asdf(.*)   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