我正忙着用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
时,这在我的本地计算机上完全正常。有什么我做错了,或者这是一个我不知道的已知事物?
答案 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