拦截所有http请求的方法
发布于 12 年前 作者 yinchonging 27546 次浏览 最后一次编辑是 8 年前

实现了一个filter过滤器,所有的请求都会先经过这个函数,然后根据逻辑才能走到下一个next()。 问题是我在filter里面获取test请求头后,在后面的get(’/test’)路由里面再取test请求头,取不到了,值为undefined。

怎么能再把test请求头set回req里面?

var server = express.createServer();

//实现的过滤函数 var filter = function (req, res, next) { var test = req.headers.test;//这时候是有值的,但是后面get(’/test’)里面就没值了。 //有没有可以将test在set回req里面的API?我翻遍了node的req和express的文档,没看到有 //或者有其他方法实现这种过滤技术吗? if (test) { next(); } else { return res.send(‘filter ok’); } };

server.configure(function () { server.use(express.bodyParser()); server.use(express.methodOverride()); server.use(filter);//使用filter进行过滤 server.use(server.router); });

server.get(’/test’,function(req,res){ //在这里再次取test请求头的值已经取不到了 var test = req.headers.test; //test = undefined; });

13 回复

没看明白~~~

其实就是,我在用完了req.headers.test后,后面的代码能继续使用req.headers.test参数。 现在是后面用不了,所以我想在filter里面将用完的test请求头再set回req里面,好让后面的代码继续能使用req.headers.test。

不清楚filter实现,LZ可以变个思维,用Session保存test,路由到/test的时候从session中取:

req.session.test = req.headers.test;

还是不明白你的意思。

  1. 一般情况下req.headers是不应该改动的,而且你取了一次值也不会自动消失啊!不知道你所说的**“用完了”**到底是个神马情况?

  2. 如果要传值给下一个中间件,直接将值附加到reqres上就可以了,比如:req.ooxx = 'OOXX';

此req非彼req

@yinchonging

var express = require('express')
  , routes = require('./routes')
  , http = require('http')
  , path = require('path');

var app = express();

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  // 第1个filter
  app.use(function (req, res, next) {
    console.log(req.headers.host);
    next();
  });
  // 第2个filter
  app.use(function (req, res, next) {
    console.log(req.headers.host);
    next();
  });
  // 第3个filter
  app.use(function (req, res, next) {
    console.log(req.headers.host);
    next();
  });
});

app.get('/', function (req, res, next) {
  res.send(req.headers.host);
});

http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

你猜个毛啊?!req.headers就是一个对象:http://nodejs.org/api/http.html#http_request_headers

都不知道你从哪里学了个新名词叫神马**“字节流”**

@leizongmin 你丫说话客气点。

这是一个bug。 代码改为: if (test) { next(); } else { return res.send(‘filter ok’); } };

原来是: if (test) { return res.send(‘filter ok’); } else { next();//test本来就没有,后面肯定取不到 } };

@leizongmin 老雷你这次不厚道了啊~req.headers 官方明明说是read only

在express和connect的requestresponse对象都是不变的,所以可以直接对reqres进行操作。当然webjs不太一样,但是也可以相同的操作。

@snoopy 我没说不是 read only 啊?

@snoopy 这个req.headers是可以改的

get方法是过滤url header.test和url没关系的

回到顶部