[英]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.