Node.js - 为什么这些模块不像我期望的那样工作?

时间:2013-10-29 01:22:42

标签: node.js node.js-connect

以下代码显示的不是我期望的行为。


我的期望:

GET / - >显示“欢迎”并关闭连接

POST /pages - >增加/记录计数器;显示“在POST功能中”,并关闭连接

GET /someRandomPath - >增加/记录计数器;显示404消息


我观察到了什么:

GET / - >显示“欢迎”并关闭连接

POST /pages - > 没有计数器的增量/日志; 显示“在POST功能中”,并关闭连接

GET /someRandomPath - >增加/记录计数器;显示404消息


代码:

var express = require('express');
var request_counter = 0;

var app = express()

    .use(express.basicAuth('test', 'test'))

    //serve the root (welcome)
    .get('/', function(req, resp, next) {
        resp.end('welcome');  
    })  

    //  count/log the requests
    .use(function(req, resp, next) {
        console.log('request# ' + (++request_counter));
        next();
    })

    //  serve "/pages"
    .post('/pages', function (req, resp, next) {
        console.log('in the POST function');
        resp.end('in the POST function');
    })

    //  serve 404
    .use(function (req, resp) {
        resp
            .status(404)
            .end('BB: not found')
        ;
    })
;

module.exports = app;

当我拨打POST /pages时,为什么计数器不会递增/记录?

我注意到的一件事是,如果我注释掉//serve the root部分,我会得到我期望的行为。

1 个答案:

答案 0 :(得分:1)

this answer中所述,您似乎应该在开始定义路线之前定义所有中间

您没有明确使用app.use(app.router),但会在you use app.get时自动调用。

知道这一点,我很可能会将您的代码更改为类似的内容:

var express = require('express');
var request_counter = 0;

var app = express()

app.use(express.basicAuth('test', 'test'))

//  count/log the requests for all except '/'
app.use(function(req, resp, next) {

    if (req.path != '/') {
        console.log('request# ' + (++request_counter));
    }

    next();
})

//serve the root (welcome)
app.get('/', function(req, resp, next) {
    resp.end('welcome');  
})  

//  serve "/pages"
app.post('/pages', function (req, resp, next) {
    console.log('in the POST function');
    resp.end('in the POST function');
})

//  serve 404 for all the rest
app.all('*', (function (req, resp) {
    resp
        .status(404)
        .end('BB: not found')
    ;
}))

app.listen(1234);