2013-03-13 63 views
0

我是新來的Node.js,甚至一般的JavaScript,我目前正在使用Node/Express設置一個http服務器,它應該查詢postgresql數據庫。我不確定我是否正在使用路由和多個回調,並希望有人能澄清這一點。使用多個回調在Express/Node.js中路由

現在,它看起來像這樣:

在我web.js

var routes = require('./routes'); 
app.get('/get/user/:userid', routes.user, routes.dbquery); 

路線/ index.js

exports.user = function(request, response, next) { 
    request.querystring = "select * from users where userid = " + request.param('userid'); 
    next(); 
}; 

exports.dbquery = function(request, response) { 
    pg.connect(process.env.DATABASE_URL, function(err, client, done) { 
     var query = client.query(request.querystring); 
     query.on('row', function(row, result) { 
      result.addRow(row); 
     }); 
     query.on('end', function(result) { 
      response.send(JSON.stringify(result.rows)); 
     }); 
     done(); 
    }); 
}; 

它的工作原理,但這是設置路由的正確方法嗎?具體來說,傳遞請求變量中的查詢字符串這樣的變量是否可行?或者還有其他一些首選解決方案嗎?

我想這樣做的原因是因爲我希望能夠重用dbquery函數,因爲我將有多個將查詢數據庫的路由。

+0

看起來沒問題,雖然我會使用佔位符而不是字符串連接來構建查詢。 – robertklep 2013-03-13 10:56:19

+0

你爲什麼用中間件生成查詢?爲什麼不直接在dbquery中做任何具體的原因呢? – 2013-03-13 11:06:45

+0

@robertklep好酷謝謝你! – erikhaq 2013-03-13 11:11:33

回答

1

是的,你可以附加任何你想要的東西request對象(這是一種常見的做法)。但是,數據只應與請求相關,而您的查詢僅與請求無關(userid除外)。

因此,如何代替中間件定義查詢只是定義外部函數:

var get_query = function(userid) { 
    // NOTE: You should validate userid!!! 
    return client.query("select * from users where userid = " + userid); 
}; 

,並調用它在你的dbquery路線?並只附加useridrequest

+0

謝謝@freakish。任何想法如何使這個reusabale不同的查詢雖然? – erikhaq 2013-03-13 12:41:21

+0

@erikhaq取決於查詢。你可能想要使用一些適當的ORM。我確定有PostgreSQL的ORM。搜索他們。 – freakish 2013-03-13 12:45:37

+0

好!再次感謝! – erikhaq 2013-03-13 13:11:09