Приложение Node JS работает одновременно с Express API с MongoDB - PullRequest
0 голосов
/ 26 августа 2018

Что я пытаюсь сделать: у меня есть небольшое приложение 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);

server.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 к серверу.JS, но это все еще не работает

mongoose.connect('mongodb://localhost:27017/stock-test')
    .then((res) => {
        console.log('connected');
    })
    .catch(err => {
        console.error(err);
    });

1 Ответ

0 голосов
/ 26 августа 2018

Редактировать: вот суть с рабочими изменениями https://gist.github.com/drGrove/3e6699ded09f282e528a661fb41439e1

Ваш API-интерфейс использует схему, с которой у него нет информации. Вы должны извлечь StockMomentData, require его из вашего api.js и использовать его в вашем запросе get по id вместо вашей stock модели.

Поскольку ваше соединение mongoose совместно используется двумя «приложениями», вы можете извлечь это в файл db.js и просто потребовать этот файл при загрузке для каждого проекта (но это всегда можно сделать позже).

Просто обратите внимание, что вам нужно соединение либо в файле модели, либо в файле api.js, чтобы mongoose действительно подключался к базе данных mongo

Начальный ответ: На вашем сервере API отсутствует соединение с Mongo через mongoose. Вам нужно будет установить соединение, как и в «автономном приложении».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...