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

时间:2015-05-12 14:35:53

标签: express nginx digital-ocean io.js

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

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 visited”。奇怪的是,当邮件请求发送到http://localhost:3000/login时,这在我的本地计算机上完全正常。有什么我做错了,或者这是一个我不知道的已知事物?

1 个答案:

答案 0 :(得分:1)

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

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

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

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