【问题标题】:Building an API with node and express, how to get json data from a url?用 node 和 express 构建 API,如何从 url 获取 json 数据?
【发布时间】:2016-11-26 23:59:46
【问题描述】:

我正在为使用 Angular 2 构建的 SPA 构建 API,对于这个应用程序,我有一个独立的 API,而不是 Angular 2 应用程序。所以它们建立在两个独立的 node.js 服务器上。我正在使用 node.js 和 express 以及 'express-connection' 和 'mysql' 模块来构建一个安全的 API 来处理登录和注册 JWT(json Web 令牌),当然还有其他任务。所以我已经成功地构建了这个 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')
    );
};

查询.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);
                });
            });
        }
    }
};

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

【问题讨论】:

  • 您没有显示您在 user.js 中实际使用的代码,但这可能是 How to return a value from an asynchronous call 的副本。奇怪的是,您没有显示实际问题所在的代码。而且,是的,setTimeout() 是错误的方法,但不确定您真正想要做什么才能知道要推荐什么。

标签: javascript angularjs json node.js api


【解决方案1】:

我不确定我为什么需要 Angular 代码来与不同的 UrL 通信,但我会编写服务器代码来接收来自 Angular 的请求,然后在内部与其他 API 联系以获取所需的数据。基本上使用节点服务器充当代理来访问其他 API。

【讨论】:

    【解决方案2】:

    jfriend00在他的评论中是对的,这是异步调用的问题。

    您正在寻找启动以下内容的初始请求:前端请求 > NodeJS API > 数据库查询

    而response的response和return promises以相反的顺序创建一个响应链:Database Response > NodeJS API > Frontend Response

    您可能正在寻找带有 .then() 的角度函数 $http.get 来执行您的前端调用。但是您还需要一个异步函数来从 API 或数据库实例中请求数据,然后在前端可以使用的端点上提供它。为此,您需要在 jfriend00 的评论中列出的服务器端代码中使用 promise or callback

    考虑只使用 NodeJS API,直到您可以实现所需的响应和请求,然后再使用 Angular 构建您的前端。 users.js 文件是一个很好的起点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 1970-01-01
      • 2018-08-14
      • 2020-03-17
      • 2020-07-01
      相关资源
      最近更新 更多