2015-11-19 70 views
1

我正在用Node.js和Express創建一個API。我使用Postgres作爲數據庫。Node.js,Express和Postgres設計

我想創建一個叫做DBConn的「全局對象」,我可以從App中的任何地方訪問它。此對象將具有插入,更新,驗證等功能。

Node和Express中的通用體系結構如何工作?在Node中實例化它是否有意義,並保持與DB的通信處於打開狀態,還是每次我想要執行數據庫操作時都應該實例化它?

回答

1

下面是您正在尋找的,使用pg-promise一切:

// Users repository: 
var repUsers = function (obj) { 
    return { 
     add: function (name) { 
      return obj.none("insert into users(name) values($1)", name); 
     }, 
     delete: function (id) { 
      return obj.none("delete from users where id=$1", id); 
     } 
     // etc... 
    }; 
}; 

var options = { 
    extend: function() { 
     // extending the protocol: 
     this.users = repUsers(this); 
    } 
}; 

var pgp = require('pg-promise')(options); 

var cn = "postgres://username:[email protected]:port/database"; 

var db = pgp(cn); // your global database instance; 

db.users.add("John") 
    .then(function() { 
     // success; 
    }) 
    .catch(function (error) { 
     // error; 
    }); 

這也將自動管理數據庫連接,你只會繼續使用可變db整個應用程序。

設置存儲庫是可選的,您可以始終使用聯機查詢。詳情請見the librarymore examples

+0

但是,只會在同一個* .js文件中工作,對吧?我正在使用Express,並且我在/ routes文件夾下有好幾個文件,實際上我要執行大部分數據庫的東西。我是否應該將此代碼(或導入它)複製到每個js文件,或者將它設置在主app.js中是否可以? –

+0

@CarlosNavarro當然不是! :)你需要熟悉NodeJS模塊的概念,以及如何使用'module.exports'。它非常簡單,並且是使用NodeJS編寫應用程序的非常好的ABC。 –

+0

我明白了!所以如果我把它保存在一個單獨的js文件中,並將var「db」重命名爲「exports.db」,那麼這樣就足夠了嗎?或者我應該將「exports。*」添加到每個變量中?畢竟我只會使用「全局」的唯一變量就是「db」,對嗎? –

0

我不知道的Postgres所有,但也許你可以試試這個:

創建一個名爲「DBConn.js」在YourApp /共同目錄文件。

DBConn.js:

var DBConn = exports = modules.exports = {} 

//code to connect to database 
.... 

//insert update detele select 
DBConn.insert = function(arguments) { 
    //some code 
} 

..... 

DBConn.update = function(arguments) { 
    //some code 
} 

然後,你可以要求它像YouApp /控制器/ UserController.js任何其他控制器

UserController.js:

var DBConn = require('../common/DBConn.js') 

模塊緩存示例

index.js:

require('./DB.js'); 
require('./DB.js'); 

DB.js

var DB = exports = module.exports = {} 

function connect() { 
    //connect to database code 
    console.log('Connect!'); 
} 

connect(); 


//other code 

然後node index.js,我們可以看到,「連接!只記錄一次。 因爲當我們第一次需要('DB.js')時,node.js將它放到模塊緩存中,當我們再次需要DB.js時,我們從緩存中獲取DB.js。

+0

謝謝!現在我想進一步說明一下。事情是:我有「主要應用程序」(應用程序。js)我在哪裏設置「var DBConn = require ...」。但是然後路由由其他一些js文件處理(app.js也需要這些文件)。我想要從其他js文件訪問app.js的DBConn。當然,我可以從這些js文件中得到它,但是到DB的連接將被重新建立。 –

+0

感謝node.js模塊緩存,你不需要擔心這個!我會在我的答案中給你一個例子。 –