无法捕获node.js中的上下文

时间:2015-12-29 05:39:09

标签: javascript node.js asynchronous express

我试图了解闭包在node.js中的工作原理

我有一个快速中间件抓取远程站点(* json)的内容。这里的情况是我无法使用远程内容更新快速请求(我认为可能),以便在其他中间件中进一步处理它。

欢迎任何帮助:)

问候

    const request = require('request');
    const app = require('express')();
    const base = { url: 'http://api.xxx', record: 'todo' };

    function getFile(opts, cb) { // parse url using request
      request({
        url: opts.url,
        headers: {
            'User-Agent': 'request',
            'Content-type': 'application/json'
        }
      }, function (error, response, body) {
        if (error || response.statusCode != 200) {
            cb(error);
        } else {
            var ret = {content: JSON.parse(body), request: opts}
            cb(null, ret);
        }
      });
    }

    function grabData(req, res, next) {
    console.log(new Date(), req.method, req.url);
      getFile(base, function(err, data){

        console.log(data.content); // WORKS OK!

        //? How to get data.content injected in the request
        // req.contents = data.content // not working

           next();
      });

    }

// function calls ---------------------

app.use(grabData);

//app.use(furtherProcess)  //? how to pass args here?

app.get('/',  function(req,res){
    res.send("> "+req.contents);
    res.end();
});

app.listen(3000, function(){ console.log('Listen on port 3000...' ); });

1 个答案:

答案 0 :(得分:1)

我在中间件中看不到对next()的任何调用。修改next()对象后,您需要调用req

function grabData(req, res, next) {
  getFile(base, function(err, data){
    req.contents = data;
    next();
  })
}