繁体   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