แอป Node JS ทำงานพร้อมกันกับ express api กับ MongoDB

สิ่งที่ฉันพยายามทำ: ฉันมีแอป Node ขนาดเล็กส่งคำขอไปยัง API เพื่อรับข้อมูลเกี่ยวกับตลาดหุ้น จากนั้นบันทึกข้อมูลลงใน Mongo DB (สร้างและทำงานแล้ว) ซึ่งฉันต้องการเรียกใช้อย่างต่อเนื่อง . ต่อไป ฉันต้องสร้าง API ซึ่งอนุญาตให้เซิร์ฟเวอร์/แอปอื่นๆ ของฉันรับข้อมูลนั้นได้ (ยังไม่ได้สร้าง)

ฉันคิดว่า Express เป็นตัวเลือกที่ดี แม้ว่าฉันรู้ว่ามีตัวเลือกอื่นอยู่ก็ตาม ฉันได้รับโค้ดนี้จาก API อื่นที่ฉันสร้างขึ้นสำหรับแอป MEAN Stack และกำลังพิจารณาแก้ไขปัญหาอยู่

ปัญหาหลักของฉันคือบทช่วยสอนส่วนใหญ่แสดงวิธีสร้าง 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 ไปยัง server.js แต่ก็ยังใช้งานไม่ได้

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

person Garrett    schedule 25.08.2018    source แหล่งที่มา


คำตอบ (1)


แก้ไข: นี่คือส่วนสำคัญของการเปลี่ยนแปลงการทำงาน https://gist.github.com/drGrove/3e6699ded09f282e528a661fb41439e1

API ของคุณกำลังดึงสคีมาที่ไม่มีข้อมูลที่เกี่ยวข้อง คุณควรแยก StockMomentData ออก require จากคุณ api.js และใช้สิ่งนั้นในคำขอรับด้วย id แทนที่จะเป็นโมเดล stock ปัจจุบันของคุณ

เนื่องจากการเชื่อมต่อพังพอนของคุณถูกแชร์ระหว่าง "แอปพลิเคชัน" ทั้งสอง คุณสามารถดึงมันออกมาใน db.js และเพียงแค่ต้องการให้ไฟล์นั้นโหลดสำหรับแต่ละโครงการ (แต่สามารถทำได้ในภายหลังเสมอ)

โปรดทราบว่าคุณจำเป็นต้องมีการเชื่อมต่อกับไฟล์ Model หรือไฟล์ api.js ของคุณ เพื่อให้พังพอนเชื่อมต่อกับฐานข้อมูล mongo ได้จริง

คำตอบเริ่มต้น: เซิร์ฟเวอร์ API ของคุณขาดการเชื่อมต่อกับ Mongo ผ่านพังพอน คุณจะต้องเชื่อมต่อสายเช่นเดียวกับที่คุณมีใน "แอปแบบสแตนด์อโลน"

person drGrove    schedule 25.08.2018
comment
แค่เพิ่ม mongoose.connect('mongodb://localhost:27017/stock-test') นี้เหรอ? ดูเหมือนจะไม่ได้ผล - person Garrett; 26.08.2018
comment
ขอบคุณมากที่ทำทุกอย่าง ฉันเข้าใจดีว่าคุณกำลังทำอะไรอยู่ แต่ก็ยังไม่ได้ผล ฉันไม่ได้รับข้อผิดพลาดใดๆ แต่เมื่อฉันพยายามเยี่ยมชมจุดสิ้นสุดจุดใดจุดหนึ่งของฉัน มันค้างและไม่ทำอะไรเลย - person Garrett; 26.08.2018
comment
จริงๆ แล้วคำตอบของคุณได้ผล ขอบคุณ! ฉันแค่มองหาบางสิ่งบางอย่างตลอดเวลา - person Garrett; 26.08.2018