2016-02-14 96 views
0

我知道Javascript,但对NodeJS很新。我想在我的代码中的任何地方重新使用http请求server.js之外。请看看:如何全局使用Node http请求

server.js

 

    var http = require('http'); 
    var mongodb = require('./db'); 
    var settings = require('./settings'); 
    var oauth = require('./oauth'); 

    //start mongodb connection 
    mongodb.connect(function(error){ 
     if (error) console.error(error); 
     else { 
      //set db as mongodb client 
      var db = mongodb.use(); 
      //start http server 
      http.createServer(function(request,response){ 
       //set POST body 
       request.body = ''; 
       request.on('error',function(error){ 
        console.error(error); 
        response.statusCode = 404; 
        response.end(); 
       }).on('data',function(chunk){ 
        request.body += chunk; 
       }).on('end',function(){ 
        //database and http server ready, start logic 
        //Now I want to "require" a file here, such as test.js and call "request.headers" to work 
       }); 
      }).listen(settings.httpPort,function(){ 
       console.log('Server listening on '+settings.httpServer+':'+settings.httpPort); 
      }); 
     } 
    }); 

现在我想要求test.js里面做以下的事情
test.js

 

    console.log(request.headers); 

注意:我不想使用任何像Express一样的框架。我想从头开始写自己的东西。请帮助我,非常感谢你。

+1

的可能的复制([node.js中做出的请求和响应全球对HTTP服务器?] http://stackoverflow.com/questions/7262727/node-js-make-request-and-response-global-for-http-server) – Abhijeet

回答

0

如果我理解正确,问题似乎是这样的:您想要在其他模块中访问异步函数(HTTP请求)的 结果。但是, 节点的require()是同步的;没有异步require()。有 是这个几个解决方案,如果你知道 的JavaScript,这些解决方案都不会陌生。

最简单的解决方案是将server.js模块包装在一个函数中,该函数需要回调一个 。然后,调用回调一旦请求是可用的,就像这样:

// server.js 
'use strict'; 

// ... 

module.exports = function(callback) { 

    // ... 

    http.createServer((req, res) => { 
    req.body = ''; 

    // Call end with error on error 
    req.on('error', err => res.end(err)); 

    // Append chunks to body 
    req.on('data', chunk => req.body += chunk); 

    // Call callback here 
    req.on('end', err => { 
     // Call with error as first argument on error 
     if (err) callback(err); 
     // Call with request as second argument on success 
     else callback(null, req); 
    }); 

    }).listen(/*...*/); 
    // ... 
}; 

而在你的test.js文件:

// test.js 
'use strict'; 

const server = require('./server'); 

// Do something with the request here. 
server((err, req) => { 
    if (err) console.error(err); 
    else console.log(req.headers); 
}); 

有这种方法的一个问题。每次你想访问 请求时,你的服务器功能都会重新运行。如果您想运行 一次,然后根据需要多次访问请求,该怎么办?

考虑使用Node的events模块。在你的server.js文件中,你可以导出一个EventEmitter实例,而不是一个函数。在该模块中发出适当的事件 ,然后您可以在需要 访问请求的任何其他模块中添加侦听器。您server.js文件将是这个样子:

// server.js 
'use strict'; 

const EventEmitter = require('events'); 
const emitter = new EventEmitter(); 

// ... 

http.createServer((req, res) => { 
    req.body = ''; 
    req.on('error', err => res.end(err)); 
    req.on('data', chunk => req.body += chunk); 

    // Emit events here: 
    req.on('end', err => { 
    // Emit 'error' event on error. 
    if (err) emitter.emit('error', err); 
    // Emit 'data' event on success. 
    else emitter.emit('data', req); 
    }); 
}).listen(/*...*/); 

// ... 

module.exports = emitter; 

而在你的test.js文件:

// test.js 
'use strict'; 

const server = require('./server'); 

// Do something on error event. 
server.on('error', console.error); 

// Do something on data event. 
server.on('data', req => { 
    console.log(req.headers); 
}); 
+0

谢谢麦克马斯,第二个解决方案非常好。现在我想知道,从server.js中我将需要test.js和test.js我需要server.js。它会导致无休止的循环或什么? –

+0

@ShanRuan它不会造成无限循环。节点可以处理[循环依赖关系](https://nodejs.org/api/modules.html#modules_cycles)。但是,如果您对如何在节点中加载模块没有很好的把握,它很容易导致其他问题。如果可以的话,我会建议尝试重新考虑你的代码以消除循环依赖。否则,是否会导致问题将取决于您的代码。您可能会考虑在本网站上搜索其他可能对您有所帮助的问题,或者可能完全提出一个新问题。 – McMath

+0

嗨麦克马特。你说这可能会导致其他问题。你能给我举一些关于问题的例子吗?我是一个多年的PHP,所以在NodeJS中有很多新的东西。非常感谢。 –