2014-01-22 44 views
0

我試圖按照網絡上的示例創建NodeJS服務器和路由器,但遇到了問題。接下來的主要是一些其他代碼的例子。使用NodeJS的基本嘗試

Index.js

var server = require("./server"); 
var router = require("./router"); 
server.start(router.route);' 

Router.js

var fs = require("fs"); 

function route(filename) { 
    fs.readFile(filename, 'utf8', function (err, data) { 
     if (err) { 
     console.log('Error: ' + err); 
     return; 
     } 
     console.log("About to route a request for " + filename); 
     data = JSON.parse(data); 

    }) 
} 
exports.route = route; 

Server.js

var http = require('http'); 
var url = require("url"); 


function start(route) { 

    function onRequest(request, response) { 
     var filename = request.url.substr(1); 
      // call for specific json file here 
     if (filename == "favicon.ico") { 
      response.writeHead(200, {'Content-Type': 'image/x-icon'}); 
      response.end(); 
      console.log('favicon requested'); 
      return; 
     } 
     else { 
      filename += ".json";    
      console.log("Request for " + filename + " received."); 

      response.writeHead(200, { 'Content-Type': 'application/json', "Access-Control-Allow-Origin":"*" }); 
      response.write("" + route(filename),0,4); 
      response.end(); 
     } 
    }  

http.createServer(onRequest).listen(8124); 
}  

exports.start = start; 
console.log('Server running at http://127.0.0.1:8124/'); 

我的問題是,除其他外,如何做route命令工作? 當我瀏覽到服務器時得到的是'undefined'。我如何從路由器獲取實際的json?

我試過了:var result = route(filename);但是那個失敗了。

實質上,如何從路由器獲取數據並將其寫入響應。如果你還沒有猜到,javascript和NodeJS對我來說是比較新的。

任何指針將不勝感激。

謝謝。

回答

0

您的路線功能有一個異步方法fs.readFile。您需要將回調傳遞給路由功能,以便它可以正確返回數據。否則,route將立即返回沒有數據(因爲它是異步),無論您在readFile內是否有return語句。

router.js

function route(filename, callback) { 
    fs.readFile(filename, 'utf8', function (err, data) { 
     if (err) { 
      console.log('Error: ' + err); 
      return; 
     } 
     console.log("About to route a request for " + filename); 
     data = JSON.parse(data); 
     callback(data); // Call this function after the data is grabbed. 
    }) 
} 

server.js部分:

response.writeHead(200, { 'Content-Type': 'application/json', "Access-Control-Allow-Origin":"*" }); 
route(filename, function (data) { 
    response.write("" + JSON.stringify(data),0,4); 
    response.end(); 
}); 
+0

非常感謝!這是一個巨大的進步。不要麻煩你很多,但唯一的是我得到的實際數據類型[對象對象]的響應,而不是實際的信息。我將如何解決這個問題? – sum1nil

+0

@ sum1nil,你只需要調用'JSON.stringify',或者你可以調用數據將包含的任何屬性,比如'data.ID'。我更新了server.js部分。 – matth