2016-07-23 5 views
0

私はAngular 2で構築されたSPA用のAPIを構築しています。このアプリケーションでは、私は独立型APIとAngular 2アプリを持っています。したがって、それらは2つの独立したnode.jsサーバー上に構築されています。私はnode.jsを使用しており、JWT(json web token)とのログインや登録を処理する安全なAPIを構築するために 'express-connection'と 'mysql'モジュールと一緒に表現しています。だから私はURLを介して私のAngular 2アプリでデータにアクセスできるようにこのAPIを構築しました。 'localhost:3000/data'というURLを使用して、 'localhost:3001 /'で動作するAngular 2アプリからjsonデータオブジェクトにアクセスできます。しかし、データが利用可能になると、このデータオブジェクト(ユーザーの配列)にアクセスするためのAPIも必要です。このタスクにアプローチ/達成する最善の方法は何ですか?私が今考えることのできる唯一の方法は、URLからデータを取得するためにhttp getを使うよりも、アプリケーションの読み込みを待つsetTimeout関数を持たせることです。この作業を達成するためのよりクリーンな方法が必要です。基本的に単純なノードサーバーが動作しているいくつかのコードがあります。私は、APIとAngular 2のコンセプトを構築することで幾分新しいですので、どんな助けも大歓迎です。ノードとエクスプレスでAPIを構築すると、URLからjsonデータを取得する方法は?

app.js

/** Dependencies **/ 
var logger   = require('morgan'), 
    cors   = require('cors'), 
    http   = require('http'), 
    express   = require('express'), 
    errorhandler = require('errorhandler'), 
    dotenv   = require('dotenv'), 
    bodyParser  = require('body-parser'); 


/** Setup **/ 
var app = express(); 

dotenv.load(); 

app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 
app.use(cors()); 

app.use(function(err, req, res, next) { 
    if (err.name === 'StatusError') { 
    res.send(err.status, err.message); 
    } else { 
    next(err); 
    } 
}); 

if (process.env.NODE_ENV === 'development') { 
    app.use(logger('dev')); 
    app.use(errorhandler()) 
} 

/** Requires **/ 
require('./config/sql.js')(app); 
require('./config/routes.js')(app); 

/** Port **/ 
var port = process.env.PORT || 3001; 

http.createServer(app).listen(port, function (err) { 
    console.log('listening in http://localhost:' + port); 
}); 

routes.js

// routes.js 
module.exports = function(app) { 
    var query = require('./query.js')(app); 

    app.get('/data', function(req, res) { 
    query.getData(req,res); 
    }); 

}; 

sql.js

var connection = require('express-myconnection'); 
var mysql = require('mysql'); 

module.exports = function(app){ 
    app.use(
     connection(mysql,{ 
      host : 'localhost', 
      user : 'root', 
      password: ‘password’, 
      port : 3306, 
      database: ‘my_project’ 
     }, 'request') 
    ); 
}; 

query.js

// DB Queries 
module.exports = function(app){ 
    return { 
     getData: function(req, res) { 
      req.getConnection(function(err,connection){ 
       connection.query('SELECT * FROM users',function(err,rows){ 
        // console.log("success: ", rows); 
        res.json(rows); 
       }); 
      }); 
     } 
    } 
}; 

のuser.jsの

setTimeout(function(){ 
    // http.get function to call to API and grab data and create variable 
},500); 

// this is where I need an array of users that I get from a mysql database for login and registration logic 
var users = []; 
+1

user.jsで実際に使用しているコードは表示されませんが、これはおそらく[非同期呼び出しから値を返す方法]のdupです(http://stackoverflow.com/questions/14220321/非同期呼び出しからの応答を返す)を使用することができます。奇妙なことに、あなたは実際の問題がどこにあるかを示すコードを表示しません。そして、はい、 'setTimeout()'は間違ったアプローチですが、あなたが何を推薦すべきかを知るために本当に何をしようとしているのかは不明です。 – jfriend00

答えて

0

は、私はあなたが別のURLに話をする角度コードを必要とする理由私が得たかわからないが、私は角度からの要求を取るために、サーバーコードを記述して、内部に手を差し伸べるだろう他のAPIを使用してデータを取得する必要があります。基本的に、ノードサーバーを使用してプロキシとして動作し、他のAPIに到達します。

0

jfriend00は彼のコメントの通りです。これは非同期呼び出しの問題です。逆の順序で応答チェーンを作成するために果たすと約束を返すために、フロントエンド・リクエスト> NodeJS API>データベースクエリ

と応答:データベースのレスポンス>

次をキックオフするための初期リクエストを探していますNodeJS API>フロントエンドレスポンス

フロントエンドコールを実行するために角度関数$http.getを.then()で探していることがあります。しかし、APIまたはデータベース・インスタンスからデータを要求し、フロントエンドが使用できるエンドポイントにデータを提供するには、非同期関数も必要です。そのためには、jfriend00のコメントに記載されているサーバ側のコードにpromise or callbackが必要です。

NodeJS APIだけで作業し、必要なレスポンスとリクエストを得ることができ、後でAngleを使用してフロントエンドを構築することを検討してください。 users.jsファイルは、始めるためのきめ細かなエンドポイントです。

関連する問題