簡體   English   中英

使用節點構建API並表達,如何從網址獲取json數據?

[英]Building an API with node and express, how to get json data from a url?

我正在為使用Angular 2構建的SPA構建API,為此應用程序我有一個獨立的API,而不是Angular 2應用程序。 因此它們建立在兩個單獨的node.js服務器上。 我正在使用node.js並與“ express-connection”和“ mysql”模塊一起表達,以構建安全的API來處理通過JWT(json網絡令牌)進行的登錄和注冊,當然還有其他任務。 因此,我已經成功構建了此API,以便可以通過URL使用Angular 2應用訪問數據。 我可以使用URL'localhost:3000 / data'從運行在'localhost:3001 /'上的Angular 2應用程序訪問json數據對象。 但是,一旦數據可用,我還需要API才能訪問此數據對象(用戶數組)。 解決/完成此任務的最佳方法是什么? 我現在唯一想到的方法是擁有一個setTimeout函數,該函數等待應用程序加載,而不是使用http get來獲取URL中的數據。 必須有一種更干凈的方式來完成此任務。 這是我正在工作的一些代碼,基本上是一個運行express的簡單節點服務器。 我對構建API和Angular 2概念有些陌生,因此非常感謝您的幫助。

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 = [];

我不確定為什么您需要Angular代碼才能與其他UrL對話,但是我會編寫服務器代碼來接收來自Angular的請求,然后內部訪問其他API以獲取所需的數據。 基本上使用節點服務器充當代理來訪問其他API。

jfriend00在他的評論中是對的,這是一個異步調用的問題。

您正在尋找啟動以下內容的初始請求:前端請求> NodeJS API>數據庫查詢

滿足和返回承諾的響應將以相反的順序創建響應鏈:數據庫響應> NodeJS API>前端響應

您可能正在尋找帶有.then ()的角度函數$ http.get來執行您的前端調用。 但是,您還需要一個異步函數來從API或數據庫實例中請求數據,然后將其提供給前端可以使用的端點。 為此,您需要在服務器端代碼中的承諾或回調 ,如jfriend00的注釋中所列。

考慮只使用NodeJS API,直到獲得所需的響應和請求,然后再使用Angular構建前端。 users.js文件是一個很好的起點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM