javascript - Node JS 应用程序与 MongoDB 的 express api 同时运行
问题描述
我正在尝试做的事情:我有一个小型 Node 应用程序向 API 发出请求以获取有关股票市场的数据,然后将数据保存到 Mongo DB(已经制作并正在工作)中,我希望它不断运行. 接下来,我需要构建一个 API,它允许我的其他服务器/应用程序获取该数据(尚未制作)。
我认为 Express 是一个不错的选择,尽管我知道还有其他选择。我从为 MEAN 堆栈应用程序构建的另一个 API 获取此代码,并且一直在寻找故障排除。
我的主要问题是大多数教程都展示了如何为 MEAN、MERN 和其他堆栈构建一个 CRUD API。我不太确定如何构建这个系统,或者 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);
});
解决方案
编辑:这是工作更改的要点https://gist.github.com/drGrove/3e6699ded09f282e528a661fb41439e1
您的 api 正在提取一个没有与之关联的信息的模式。您应该require
从您的 api.js 中提取 StockMomentData,并在您的 get 请求中使用它,而不是您当前的stock
模型。
由于您的猫鼬连接在两个“应用程序”之间共享,您可以将其拉出到 db.js 中,并且只需要为每个项目加载该文件(但这总是可以在以后完成)。
请注意,您确实需要在模型文件或 api.js 文件中建立连接,以便 mongoose 实际连接到 mongo 数据库
初始答案:您的 API 服务器缺少通过 mongoose 与 Mongo 的连接。您必须像在“独立应用程序”中一样进行连接呼叫。
推荐阅读
- angular - Clarity 网格批处理操作是否支持跨页面选择(网格分页)?
- css - 如何定位特定标签和文本,并将其变成链接到手机拨号屏幕的按钮
- git - 将 git 项目移动到文件夹中
- angular - 从 Angular 指令中获取 NgForm 实例
- sql - 正确处理 XML 表中的日期
- session - 谷歌分析 - PageView vs Sessions
- jquery - 使用 jQuery 多次追加
- android - 相机 API 上的图像方向
- javascript - 使用链接发送到表单的变量从表单外部的链接提交表单?
- firebase - 向云函数发送太多参数,PayloadTooLargeError: too many parameters