2016-10-07 2 views
0

추 신 : 질문이 길어 보일지 모르지만 아래에 초점이 맞춰진 질문이 있습니다.올바른 방법으로 ExpressJs + MySQL을 사용하는 방법

그래서 나는 합리적인 말로 표현을 통해 MySQL을 사용해야하는 불행한 소수의 사람들 중 하나입니다. 이것은 API 백엔드로 사용됩니다. 나는 그들의 사이트 (https://expressjs.com/en/starter/generator.html)에있는 생성기를 사용하여 익스프레스 앱을 생성하고 mysqljs (https://github.com/mysqljs/mysql)에서 mysql을 설치했다.

이제 익스프레스의 모든 예제는 MongoDb를 예제로 사용하며 래퍼 만 사용합니다. 그리고 mysqljs 예제는 그다지 알려주지 않는다. 여기 몇 가지 질문이있는 프로젝트 구조가 있습니다.

bin - auto generated files to start the app 
config 
models (Maybe have a base model which can talk to db wrapper and other models can extend that) 
routes 
.... index.js 
.... users.js etc etc (each included in the app.js to have some sort of structure) 
utils 
.... db.js (check code below) 
app.js 
package.json 

지금이 내가 (users.js 같이하는 index.js를) 내 db.js
var mysql = require('mysql'); 

var pool = mysql.createPool({ 
    connectionLimit : 100, 
    host: 'localhost', 
    user: 'root', 
    password: 'notsoblank', 
    database: 'somedevdb' 
}); 

module.exports = pool; 

에 그리고 내 경로 파일이 무엇인지, 나는이로 사용하고 있습니다 :

그리고

var express = require('express'); 
var router = express.Router(); 
var db = require('../utils/db'); 
/* GET groups listing. */ 
router.get('/', function(req, res, next) { 
    db.getConnection(function(err, connection) { 
     var sql = 'SELECT * from groups'; 
     connection.query(sql, function(err, rows, fields) { 
      if (err) throw err; 
      res.json(rows); 
     }); 
     connection.release(); 
    }); 
}); 

module.exports = router; 
은 다음 app.js,이 위의 파일은 다음과 같이 포함됩니다 :

var express = require('express'); 
var path = require('path'); 
var logger = require('morgan'); 

var app = express(); 

var routes = require('./routes/index'); 
var users = require('./routes/users'); 
var groups = require('./routes/groups'); 

app.use('/apis/groups', groups); 

module.exports = app; 

이제이 앱을 실행하면 localhost:5000\apis\groups과 같은 API 엔드 포인트를 갖게되며 다른 앱에서이를 사용할 수 있습니다. 나는 것을 수입하고

  1. 모든 경로 파일 (하는 index.js, users.js, groups.js)에서 db.js : 여기

    이 기반으로 내 질문입니다. 이것은 우리가 API를 명중 할 때마다 db pool이 생성된다는 것을 의미합니까?

  2. 나는 내 작업을 위해 많은 일반 SQL을 작성하려고한다. 이제는 많은 어댑터 또는 OEM이 있다는 것을 알고 있지만, getOne과 같은 메소드를 사용하여 간단한 래퍼를 작성하거나 추가 또는 삭제하는 등의 작업을 수행하는 것이 가장 좋습니다.

  3. Connection.query는 약속을 반환합니다. 추가 조작을 원한다면 어떻게해야할까요?

db.js에 db 자격 증명을 유지하는 것 외에 다른 방법으로이 방법이 잘못되어 스케일링을 막을 수 있습니까?

+0

아무도 사용하고 있지 않거나 엉터리 해결책 인 경우 불행합니다. 그렇지 않다. https://codeforgeek.com/2015/01/nodejs-mysql-tutorial/ – Amnon

+0

과 같은 많은 자습서 중 하나를 통해 걷는 것이 좋습니다.이 방법을 포함하고 시작하는 방법에 대한 기본 예제 일뿐입니다. 아무도 당신이 시작한 후에 무엇을해야하는지 말하지 않습니다. 이미 연결 풀을 만들고 쿼리를 만들 수 있지만 코드 중복이 많이 발생하며 전체적으로보기가 어렵습니다. 그리고 때로는 요구와 사용 등으로 어떤 일이 일어나는지 알지 못합니다. –

+0

sequelize 또는 다른 ORM을 사용하면 코드 관리에 장기간 도움이 될 수 있습니다. – Paul

답변

0

코드 팽창을 줄이는 데 도움이되는 일종의 db 도우미 모듈을 찾고 있다면 (이것은 ORM을 통해 해결 된 문제인 것처럼 느껴진다), 그렇게하는 것이 아주 간단합니다. 원하는 기능을 숨기고 반복적 인 내용은 숨 깁니다. 이런 식으로 뭔가 작동 것 : 원래 문제

var db = require('./db')(myOptions); 

db.query('select * from groups', console.log); 

몇 가지 :

// db.js 아니라 단지 풀을 노출보다 다음과 같은 일을 할 것입니다 코드를 호출

var mysql = require('mysql'); 

// expose the options so that the calling code can inject the password and so on, probably from config or process.env variables. 
function db(options){ 
    // todo: sanitize options and set defaults 
    var pool = mysql.createPool(options); 

    return { 
    query : function(sql, callback){ 
     db.getConnection(function(err, connection) { 
     connection.query(sql, function(err, rows, fields) { 
      callback(err, rows, fields); 
      connection.release(); 
     }); 
     }); 
    } 

    } 

} 


module.exports = db; 

코드, 그런데.

1) 연결을 요청했습니다.연결을 가져 오기위한 콜백에서 release()를 호출하고 쿼리를 반환하지 않습니다. 느린 DB 쿼리를 사용하면 연결을 종료하기 전에 연결을 해제 할 수 있습니다.

2) Promises를 사용하지 않는 한 콜백에 오류를 던져서는 안되며, 어떤 방식 으로든 처리하거나 다음 콜백으로 전달해야합니다.

+0

그래서이 파일이 필요하다면 모든 경로를 말하면 각각에 대해 별도의 풀이 생성됩니까? DB는 한 번에 10 개의 연결을 처리 할 수 ​​있기 때문에 연결의 총 수를 최대 10 개로 유지하고 싶습니다. 각 경로가 자체 연결 10 개를 생성하는 경우 지연이 있어도 간단하게 잘못된. –

+0

이 데이터베이스의 인스턴스를 하나만 만들면 모든 경로에서이 경로를 사용해야한다고 생각하면 올바른 길을 가고 있습니까? –

+0

필자가 작성한 방법, 네, 내 보낸 함수를 호출 할 때마다 풀을 생성합니다. 당신은 싱글 톤 메카닉을 원하는 것 대신 사용할 수도 있고, db.js 본문에있는 config에서 옵션을 가져 와서 함수 밖에서 풀을 인스턴스화 할 수도 있습니다. 어느 쪽이든 당신이 일하는 방식에 가장 잘 맞는 것입니다. – Paul

관련 문제