首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点JS应用程序与使用MongoDB的快递api同时运行

节点JS应用程序与使用MongoDB的快递api同时运行
EN

Stack Overflow用户
提问于 2018-08-25 22:20:01
回答 1查看 201关注 0票数 1

我想要做的是:我有一个小型Node应用程序,它向API请求获取股票市场的数据,然后将数据保存到一个Mongo (已经制作和工作),我想要不断地运行它。接下来,我需要构建一个API,它允许我的其他服务器/应用程序获取数据(尚未生成)。

我认为快递是一个不错的选择,虽然我知道还有其他选择。我是从另一个API中获得这段代码的,我为一个普通的堆栈应用程序构建了这个API,并且一直在寻找解决问题的方法。

我的主要问题是,大多数教程展示了如何为MERN和其他堆栈构建CRUD。我不太清楚如何构造这个系统,或者Node应用程序可以以我所描述的方式独立运行。

目前,我没有收到任何错误时,我运行的应用,但我无法得到任何东西,当我去我的终结点。

当我刚开始工作时,我认为独立的Node应用程序(请求和写入数据部分)可以与Express部分位于同一个文件中,但现在我认为这样做不起作用,并将这些文件分割成不同的文件。我见过PM2和其他将节点应用程序变成后台服务的方法?

不完全肯定,一些澄清,以及一些帮助,为什么我的快递API端点将不会响应来自数据库的数据。这是我的密码。

独立应用程序:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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('--------------------');
});

股票模型:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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;

编辑:向server.js添加了mongoose.connect,但仍然无法工作

代码语言:javascript
复制
mongoose.connect('mongodb://localhost:27017/stock-test')
    .then((res) => {
        console.log('connected');
    })
    .catch(err => {
        console.error(err);
    });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-25 22:31:01

编辑:下面是一个包含工作更改https://gist.github.com/drGrove/3e6699ded09f282e528a661fb41439e1的要点

您的api正在提取一个没有与其关联的信息的架构。您应该打破StockMomentData,将其从api.js中分离出来,并在get请求中使用id,而不是当前的stock模型。

由于您的猫鼬连接是在两个“应用程序”之间共享的,所以您可以将其提取到一个db.js中,并只需要为每个项目加载该文件(但以后总是可以这样做)。

请注意,您确实需要在模型文件或api.js文件中建立连接,这样猫鼬才能真正连接到mongo数据库

初步答案:您的API服务器缺少通过mongoose连接到Mongo的连接。你必须有一个连接电话,就像你在你的“独立应用程序”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52021668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档