2017-06-29 32 views
1

私はノードと約束を新しくしました。私は2つのファイルを持っています:server.jsdb.jsオブジェクトをSQLクエリ関数から別の関数に渡す

server.jsインポートdb.jsモジュールです。

db.jsモジュールのSQLデータベースからデータを取得していますが、そのデータをserver.jsの関数に渡そうとしています。 データベースからデータを正常に取得しましたが、server.jsの関数に渡そうとすると、undefinedの値しか返されません。

ここ

const db = require('./db.js'); 

app.post('/api/trigger-push-msg/', function (req, res) { 
    return getSubscriptionsFromDatabase() 
    .then(function(subscriptions) { 

    // Do something 

    }); 
}); 

function getSubscriptionsFromDatabase() { 
    return new Promise((resolve, reject) => { 
    let subscriptions = db.getSubscriptions(); 

    console.log(subscriptions); // this only prints "undefined" 

    if (subscriptions != undefined) { 
     resolve(subscriptions); 
    } else { 
     reject("No"); // this executes 
    } 
    }) 
} 

db.js

module.exports = { 
    getSubscriptions: function() { 
    var sql = "SELECT * FROM subscriptions"; 

    con.query(sql, function(err, result) { 
     if (err) throw err; 
     console.log(result); // this prints the same result as I want 
     return result; 
    }) 
    } 
} 
+0

あなたは 'getSubscriptions'機能に' '返す新しい約束(...)を置く必要があります。そのコールバックから 'return'することはできません。あなたは' resolve'を呼び出すことしかできません。 – Bergi

答えて

1

getSubscriptionsは、return文

を持っていないコード

server.jsです

と、そこにいくつかの非同期コンテンツがあると考えると、すべてを約束の中に入れて、解決した後でのみ後続のロジックをトリガーする必要があります。

その後、
module.exports = { 
    getSubscriptions: function() { 
    var sql = "SELECT * FROM subscriptions"; 
    return new Promise(function(resolve, reject){ 
     con.query(sql, function(err, result) { 
     if (err) return reject(err); 
     resolve(result); 
     }) 
    }) 
    } 
} 

function getSubscriptionsFromDatabase() { 
    return db.getSubscriptions() 
    .then(function(subscriptions){ 
    return subscriptions; 
    }) 
} 

とあなたのルートで:

app.post('/api/trigger-push-msg/', function (req, res) { 
getSubscriptionsFromDatabase() 
    .then(function(subscriptions) { 
    res.send(subscriptions); 
    }) 
    .catch(function(err){ 
    res.sendStatus(500); 
    }) 
}); 
+0

'resolve(subscriptions);の前にコンソールログステートメントを追加しましたが、まったく実行されません。 –

+0

コードが修正されました。現在動作しているか確認してください:) – Karim

関連する問題