2016-02-14 79 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中有很多新的東西。非常感謝。 –