Создание API с помощью узла и экспресса, как получить данные JSON из URL-адреса?

0

Я создаю API для SPA, построенного с помощью Angular 2, для этого приложения у меня есть автономный API и приложение Angular 2. Таким образом, они построены на двух отдельных серверах node.js. Im использует node.js и выражает вместе с модулями "express-connection" и "mysql" для создания безопасного API для обработки входа и регистрации с помощью JWT (json web tokens), а также, конечно же, с другими задачами. Поэтому Ive успешно построил этот API, чтобы я мог получить доступ к данным с помощью своего приложения Angular 2 через URL. Я могу использовать URL localhost: 3000/data для доступа к объекту данных json из моего приложения Angular 2, работающего на "localhost: 3001/". Тем не менее, мне также нужен API для доступа к этому объекту данных (массив пользователей), как только данные станут доступными. Как лучше всего подойти к этой задаче? Единственный способ, о котором я могу думать сейчас, это иметь функцию setTimeout, ожидающую загрузки приложения, чем использование http get для захвата данных из URL-адреса. Должен быть более чистый способ решения этой задачи. Имеет некоторый код, который у меня есть, в основном простой сервер узлов, работающий экспресс. Я несколько новичок в создании API 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 = [];
  • 1
    Вы не показываете код, который вы на самом деле используете в user.js, но это, вероятно, дурак Как вернуть значение из асинхронного вызова . Странно, вы не показываете код, где настоящая проблема. И да, setTimeout() - неправильный подход, но не уверен, что вы действительно пытаетесь сделать, чтобы знать, что порекомендовать.

2 ответа

0

jfriend00 прав в своем комментарии, это вопрос асинхронных вызовов.

Вы ищете исходные запросы, чтобы начать следующее: Запрос на Frontend> NodeJS API> Запрос базы данных

И ответ на выполнение и возвращение обещаний для создания цепочки ответов в обратном порядке: ответ базы данных> API NodeJS> ответ Frontend

Вероятно, вы ищете угловую функцию $ http.get с.then() для выполнения ваших внешних вызовов. Но вам также нужна асинхронная функция для запроса данных из API или экземпляра базы данных, а затем предоставить ее на конечной точке, которую может использовать интерфейс. Для этого вам нужно обещание или обратный вызов в вашем серверном коде, как указано в комментарии jfriend00.

Подумайте о том, как работать только с вашим NodeJS API, пока не сможете получить ответ и запросы, которые вам нужны, и выстроить свой интерфейс с помощью Angular позже. Файл users.js - прекрасная конечная точка для начала.

0

Я не уверен, что я понял, почему вам нужен угловой код для разговора с другим UrL, но я бы написал код сервера, чтобы принимать запросы от Angular, а затем внутренне добираться до другого API, чтобы получить требуемые данные. В основном используйте сервер узлов, чтобы действовать как прокси для доступа к другому API.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню