我正在用Node.js和Express創建一個API。我使用Postgres作爲數據庫。Node.js,Express和Postgres設計
我想創建一個叫做DBConn的「全局對象」,我可以從App中的任何地方訪問它。此對象將具有插入,更新,驗證等功能。
Node和Express中的通用體系結構如何工作?在Node中實例化它是否有意義,並保持與DB的通信處於打開狀態,還是每次我想要執行數據庫操作時都應該實例化它?
我正在用Node.js和Express創建一個API。我使用Postgres作爲數據庫。Node.js,Express和Postgres設計
我想創建一個叫做DBConn的「全局對象」,我可以從App中的任何地方訪問它。此對象將具有插入,更新,驗證等功能。
Node和Express中的通用體系結構如何工作?在Node中實例化它是否有意義,並保持與DB的通信處於打開狀態,還是每次我想要執行數據庫操作時都應該實例化它?
下面是您正在尋找的,使用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 library,more examples。
我不知道的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。
謝謝!現在我想進一步說明一下。事情是:我有「主要應用程序」(應用程序。js)我在哪裏設置「var DBConn = require ...」。但是然後路由由其他一些js文件處理(app.js也需要這些文件)。我想要從其他js文件訪問app.js的DBConn。當然,我可以從這些js文件中得到它,但是到DB的連接將被重新建立。 –
感謝node.js模塊緩存,你不需要擔心這個!我會在我的答案中給你一個例子。 –
但是,只會在同一個* .js文件中工作,對吧?我正在使用Express,並且我在/ routes文件夾下有好幾個文件,實際上我要執行大部分數據庫的東西。我是否應該將此代碼(或導入它)複製到每個js文件,或者將它設置在主app.js中是否可以? –
@CarlosNavarro當然不是! :)你需要熟悉NodeJS模塊的概念,以及如何使用'module.exports'。它非常簡單,並且是使用NodeJS編寫應用程序的非常好的ABC。 –
我明白了!所以如果我把它保存在一個單獨的js文件中,並將var「db」重命名爲「exports.db」,那麼這樣就足夠了嗎?或者我應該將「exports。*」添加到每個變量中?畢竟我只會使用「全局」的唯一變量就是「db」,對嗎? –