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