2016-10-21 16 views
1

REST APIリクエストを処理し、MongoDBデータベースからデータを取得する簡単なexpress.jsサーバーを作成しました。私が特定のエンドポイント( "localhost:8081/api/getUserData")にGET要求をすると、promise chainは私の望むやり方では動かず、まだ理解しません。Express promise chainエラー

これは私が取得エラーです:私はしませんので、任意の助けをさらに説明と感謝、そしてられる

var MongoClient = require('mongodb').MongoClient; 
var express = require('express'); 
var app = express(); 
var rp = require("request-promise"); 
var cors = require('cors'); 

// use it before all route definitions 
app.use(cors({ origin: '*' })); 

/********************** REST API FUNCTIONS **********************/ 
app.get('/api/getUserData', function (req, res, next) { 
    var context = {}; 
    console.log("in api getUserData") 
    context.db_url = 'mongodb://localhost:27017/test'; 
    openDatabaseConnection(context) 
    .then(getAllUserLocations) 
    .then(closeDatabaseConnection) 
    .then(function (context) { 
     res.send(context.userLocations) 
    }) 
    .catch(function (error) { 
     console.log("ERROR :"); 
     console.log(error); 
    }) 
}) 
/********************** END REST API FUNCTIONS **********************/ 

function getAllUserLocations(context) { 
    context.db.collection("test").find().toArray().then(function (err, result) { 
    console.log("Received from db: " + result.length + " objects"); 
    context.userLocations = result; 
    return context; 
    }); 
} 

function openDatabaseConnection(context) { 
    console.log("Opening DB connection..."); 
    return MongoClient.connect(context.db_url) 
    .then(function (db) { 
     console.log("DB connection opened."); 
     context.db = db; 
     return context; 
    }) 
} 

function closeDatabaseConnection(context) { 
    console.log("Closing DB connection"); 
    return context.db.close() 
    .then(function() { 
     console.log("DB connection closed"); 
     return context; 
    }) 
} 

/********************** STARTING SERVER **********************/ 
var server = app.listen(8081, function() { 
    var host = server.address().address 
    var port = server.address().port 
    console.log("Githex server listening at http://%s:%s", host, port) 
}) 

: 「[プロパティを読み取ることができません未定義の 『DB』はTypeError]」私が間違ったことを理解する。

ありがとうございます!

+1

'context'は' db_url'プロパティだけを持つオブジェクトとして定義されているので、 'getAllUserLocations'関数で使用するときは' db'プロパティを持たない – adeneo

+0

残念ながらそれはそうではありません。私は 'db'プロパティを指定せずに動作する別のAPI要求ハンドラを提供したコードを削除しました。私はプロミスチェーンの前にdbプロパティを追加しようとしましたが、どちらも解決しません。 –

+0

あなたが正しいです、エラーは 'context'があなたの関数の中で未定義であることを示します。プロパティ 'db' undefinedの*、それはおそらく行番号とより詳細な情報がどこに付属しています。 – adeneo

答えて

0

最初のコメントで@adeneoと同じように、dbプロパティがありません。あなたの最初の関数を見てください:これまでのところ、あなたがオブジェクト上にdb_urlプロパティを追加

    空のオブジェクトとして
  1. あなたのセットアップコンテキスト
  2. app.get('/api/getUserData', function (req, res, next) { 
        var context = {}; 
        console.log("in api getUserData") 
        context.db_url = 'mongodb://localhost:27017/test'; 
        openDatabaseConnection(context) 
        .then(getAllUserLocations) 
        .then(closeDatabaseConnection) 
        .then(function (context) { 
         res.send(context.userLocations) 
        }) 
        .catch(function (error) { 
         console.log("ERROR :"); 
         console.log(error); 
        }) 
    }); 
    

    は今、この関数内でラインを通過あなたは

    context = {db_url: "mongodb://localhost:27017/test} 
    
  3. あなたはopenDatabaseConnection関数にコンテキストオブジェクトを渡してきた
  4. openDatabaseConnection関数内で、コンテキストオブジェクトを返します。この新しい返されたオブジェクトはどこにも設定されず、返されて使用されることはありません。その戻り値でgetuserlocation()関数を呼び出すとします。

ので、代わりのちょうど私が返された値を利用して、あなたがそれを使用していることを確認する必要があり

.then(function(context){getAllUserConnection(context);}) 

を行うだろう

.then(getAllUserConnection) 

を呼び出します。