2015-01-19 2 views
1

나는 Express 4.0과 함께 Bookshelf을 사용하려고 노력하고있어 함께 작업 할 수 없거나 오히려 "모범 사례"를 따르지 않는 것으로 보입니다. 책장 문서에는 항상 앱 전체에서 동일한 인스턴스를 다시 사용해야한다고 나와 있습니다. 내가 별도의 파일에 app.get()을 사용할 때Express를 사용하여 BookshelfJS의 인스턴스를 설정하고 검색하는 방법은 무엇입니까?

// When the app starts 
var app = express(); 
var knex = require('knex')(dbConfig); 
var bookshelf = require('bookshelf')(knex); 

app.set('bookshelf', bookshelf); 

// elsewhere, to use the bookshelf client: 
var bookshelf = app.get('bookshelf'); 

var Post = bookshelf.Model.extend({ 
    // ... 
}); 

그러나, 나는이 작업을 얻이 수없는 것 : 심지어 예를 보여줍니다. 내가 직접 필요한 경우

var express = require('express'); 
var app = express(); 

var knex = require('knex')({ //my db settings go here }); 
var bookshelf = require('bookshelf')(knex); 

module.exports = bookshelf; 

위의 코드가 작동합니다

var express = require('express'); 
var app = express(); 

var db = require('./server/db/db'); 
app.set('bookshelf', db); 

var api = require('./server'); 

app.use(api); 

가 여기에 위의 요구됩니다 내 db.js 파일의 예를 들어, 여기 내 app.js 파일 (내 전체 응용 프로그램의 루트)입니다. 문제가 발생한 부분은 다음과 같습니다. 책꽂이 연결을 실제로 사용할 때마다 어떤 파일이든 관계없이 동일한 프로세스를 수행하지만 실패하면 "책장"은 항상 정의되지 않습니다. 항상이 정의되지 않은납니다

var express = require('express'); 
var app = express(); 
var db = app.get('bookshelf'); 
console.log(db); 

DB 다음은 app.js에서 요구하고 "API"라고 index.js 파일의 예입니다. 새 모델을 만들려고 할 때마다 db.Model.extend({})을 수행하고 Model 속성에 액세스하려고하면 (정의되지 않았기 때문에) 오류가 발생하지만 동일한 프로세스를 사용합니다.

Bookshelf와 Express 문서를 모두 사용하면이 작업이 가능하고 그렇지 않은 것에 동의합니다. 어떤 아이디어?

var myApp = express(); 

설정하거나 같은 응용 프로그램에서 변수를 얻고 싶은 경우에, 당신은 인자로 전달해야합니다 :

답변

6

이 라인은 새로운 응용 프로그램 당신이 그것을 호출 할 때마다 생성합니다.

var api = require('./server')(myApp); 

다음 API 모듈

:

보조 노트에
module.exports = function(app){ 
    var db = app.get('bookshelf'); 
//.... 
}; 

: 당신은 단지 그것을 필요로 Node.js를 당신이해야 할 모든의 싱글에 대해 걱정하는 것입니다 필요가 없습니다.

var db = require('./path/to/db/config'); 

나중에 한 번만 인스턴스화되고 이후 호출을 위해 캐시됩니다.

+0

아, 훌륭합니다. 왜 다른 코드베이스 중 일부는 정교하고 그저 필요로하는 것만으로도 귀찮은 이유를 설명합니다. – antjanus