2016-09-30 2 views
1

Я довольно новичок в Node и JS мире. То, что я пытаюсь добиться, - это «модулировать» мои запросы и повторно использовать их в различных сценариях. Это мой дб менеджер:Promisify Custom Method

'use strict' 

const mysql = require('mysql') 
var Promise = require('bluebird') 
var using = Promise.using 
Promise.promisifyAll(require('mysql/lib/Connection').prototype) 
Promise.promisifyAll(require('mysql/lib/Pool').prototype) 
const config = require('./config') 

var pool = mysql.createPool({ 
    connectionLimit: 100, 
    host: config.dbHost, 
    user: config.dbUser, 
    password: config.dbPassword, 
    database: config.db, 
    debug: config.dbDebug 
}) 

var getConnection = function() { 
    return pool.getConnectionAsync() 
     .disposer(function (connection) { 
      return connection.release() 
     }) 
} 

var query = function (command) { 
    return using(getConnection(), function (connection) { 
     return connection.queryAsync(command) 
    }) 
} 

module.exports = { 
    query: query 
} 

В отдельном файле я хочу вызвать запрос и в зависимости от результата этого затем вызова еще один (второй использует значение результата из первого):

utils.method1() 
    .then(function (value) { 
     utils.method2(value) 
    }) 
    .catch(function (error) { 
     console.error('Error while retrieving product id: ' + error) 
     res.json({ data: error }) 
    }) 

Как я могу «прояснить» мой метод? Что еще более важно: это правильный способ отделить запросы mySQL? Можете ли вы предложить несколько лучших практик?

Для полноты вот мой method1, что выполнить запрос:

module.exports = { 
    method1: function() { 
     // ...sql 
     db.query(mysql.format(sql, params)) 
      .then(function (results) { 
       return results[0].id // clearly this is not a promise 
      }) 
      .catch(function (error) { 
       console.error('Error while retrieving...: ' + error) 
       res.status(500).send('Internal server error') 
      }) 
    } 
} 

ответ

1

вы на самом деле очень близко от promisifying:)

Конечно, results[0].id не обещание, но это окончательное значение один.

Что вы должны сделать, это вернуть цепочку обещаний вашего запроса:

return db.query(mysql.format(sql, params)) 
    .then(function (results) { 
     return results[0].id // clearly this is not a promise 
    }) 
    .catch(function (error) { 
     console.error('Error while retrieving...: ' + error) 
     res.status(500).send('Internal server error') 
    }) 

Делая это, вы будете возвращать обещание, что будет либо разрешить с последним значением вашей цепи, или потерпеть неудачу. Вы можете использовать его так, как вы просили:

method1.then(function(value){ 
    // Here, value is results[0].id 
}) 
.catch(function(err){ 
    // Manage a failed query 
}); 

Там отличный пост, который вы можете прочитать о том, как Обещания работы: https://blog.domenic.me/youre-missing-the-point-of-promises/

+0

Только возвращение прочь. =) Большое спасибо. Как бы вы считали этот скелет кода? – Jumpa

+1

Я не уверен, как понять ваш вопрос. Если вы говорите о архитектуре кода, я бы сказал, что это просто. Похоже, вы не используете ORM, например Sequelize (вы можете посмотреть!). Попробуйте управлять всеми операциями SQL как простым уровнем доступа к данным. Нулевая бизнес-логика. Просто сосредоточьтесь на основных операциях CRUD и разделите свои сущности на модули узлов. Кроме того, обратите внимание на последовательность, продолжайте возвращать обещания. Если бы это было не так, ну, извините! – noKid