Что я пытаюсь сделать: у меня есть небольшое приложение Node, которое делает запрос к API для получения данных о фондовом рынке, а затем сохраняет данные в базе данных Mongo (уже созданной и работающей), которую я хотел бы постоянно запускать. . Затем мне нужно создать API, который позволит другим моим серверам/приложениям получать эти данные (еще не созданные).
Я думаю, что Express — хороший выбор, хотя я знаю, что есть и другие варианты. Я получаю этот код из другого API, который я создал для приложения стека MEAN, и искал способы устранения неполадок.
Моя главная проблема заключается в том, что в большинстве руководств показано, как просто создать CRUD API для MEAN, MERN и других стеков. Я не совсем уверен, как структурировать эту систему, или приложения Node могут работать независимо друг от друга так, как я описываю.
В настоящее время я не получаю никаких ошибок при запуске приложения, но я ничего не могу получить, когда перехожу к своим конечным точкам.
Когда я только начинал, я думал, что отдельное приложение Node (часть этого запроса и записи данных) может жить в том же файле, что и часть Express, но теперь я не думаю, что это сработает, и разделил их на отдельные файлы. Я видел PM2 и другие способы превращения приложения узла в фоновую службу?
Не совсем уверен, некоторые разъяснения по этому поводу, а также некоторая помощь в том, почему мои конечные точки экспресс-API не будут отвечать данными из базы данных. Вот мой код.
Отдельное приложение:
const request = require('request');
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const d = new Date();
let day = d.getDay()
let hour = d.getHours();
const stockMomentSchema = new Schema({
symbol: String,
price: Number,
size: Number,
time: {type: Date, default: Date.now}
});
const StockMoment = mongoose.model('stockMoment', stockMomentSchema, 'stockPriceData');
mongoose.connect('mongodb://localhost:27017/stock-test')
.then(() => {
console.log('connected');
})
.catch(err => {
console.error(err);
});
function makeRequest() {
if(day <= 1 || day >= 5) {
if(hour >= 10 || hour <= 15) {
getMarketData();
}
}
}
function getMarketData() {
request({
url: 'https://api.iextrading.com/1.0/tops/last',
json: true
}, (err, res, body) => {
if(err) {
return console.error(err);
}
for(let i = 0; i < body.length; i++) {
const stockMoment = new StockMoment({
symbol: body[i].symbol,
price: body[i].price,
size: body[i].size,
time: body[i].time,
});
stockMoment.save((err) => {
if(err) return handleError(err);
console.log('Saved!', i);
});
console.log(body[i]);
}
});
}
makeRequest();
//setInterval(makeRequest, 5000);
сервер.js:
const express = require('express');
const path = require('path'); // Not sure if this is needed
const http = require('http');
const cors = require('cors');
const bodyParser = require('body-parser');
const app = express();
const api = require('./api');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cors());
//app.use(express.static(path.join(__dirname, 'dist'))); // Not sure if this is needed
app.use('/api', api);
app.get('*', function(req, res) {
res.status(404);
});
const port = process.env.PORT || '3000';
app.set('port', port);
const server = http.createServer(app);
server.listen('3000', function() {
console.log('--------------------');
console.log('Server running');
console.log('You can view the server at http://localhost:3000');
console.log('If you are running an Angular app on while using this server please use http://localhost:4200');
console.log('--------------------');
});
стандартная модель:
const mongoose = require('mongoose');
const uniqueValidator = require('mongoose-unique-validator');
const StockSchema = mongoose.Schema({
username: { type: String, unique: true, required: true },
password: { type: String, required: true },
email: {type: String, required: true},
phoneNumber: {type: String, required: true},
company: {type: String, required: true},
about: {type: String, required: true},
userType: {type: String, required: true}
});
StockSchema.plugin(uniqueValidator);
module.exports = mongoose.model('Stock', StockSchema);
api.js:
const express = require('express');
const router = express.Router();
const Stock = require('./stock.js');
router.get('/', function(req, res, err) {
console.log('Hello world');
});
router.get('/stocks/:id', function(req, res, err) {
console.log('Hello world');
const stockData = {
_id: false,
symbol: true,
price: true,
size: true,
time: true
}
Stock.findById(req.params.id, stockData, function(err, stock) {
if(err) {
res.send('No stocks found');
console.log(err);
} else {
res.json(stock);
}
});
});
module.exports = router;
Изменить: добавлен mongoose.connect к server.js, но он все еще не работает.
mongoose.connect('mongodb://localhost:27017/stock-test')
.then((res) => {
console.log('connected');
})
.catch(err => {
console.error(err);
});