Я создаю 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 = [];
jfriend00 прав в своем комментарии, это вопрос асинхронных вызовов.
Вы ищете исходные запросы, чтобы начать следующее: Запрос на Frontend> NodeJS API> Запрос базы данных
И ответ на выполнение и возвращение обещаний для создания цепочки ответов в обратном порядке: ответ базы данных> API NodeJS> ответ Frontend
Вероятно, вы ищете угловую функцию $ http.get с.then() для выполнения ваших внешних вызовов. Но вам также нужна асинхронная функция для запроса данных из API или экземпляра базы данных, а затем предоставить ее на конечной точке, которую может использовать интерфейс. Для этого вам нужно обещание или обратный вызов в вашем серверном коде, как указано в комментарии jfriend00.
Подумайте о том, как работать только с вашим NodeJS API, пока не сможете получить ответ и запросы, которые вам нужны, и выстроить свой интерфейс с помощью Angular позже. Файл users.js - прекрасная конечная точка для начала.
Я не уверен, что я понял, почему вам нужен угловой код для разговора с другим UrL, но я бы написал код сервера, чтобы принимать запросы от Angular, а затем внутренне добираться до другого API, чтобы получить требуемые данные. В основном используйте сервер узлов, чтобы действовать как прокси для доступа к другому API.
setTimeout()
- неправильный подход, но не уверен, что вы действительно пытаетесь сделать, чтобы знать, что порекомендовать.