У меня есть это приложение Node, которое делает запрос к API для получения некоторых данных о запасах, просматривает эти данные о запасах и затем записывает их в базу данных Mongo каждые 5 минут. Я запускаю его на сервере Digital Ocean с PM2 в качестве услуги. Однако после того, как он поработал в течение дня, я не вижу никаких данных в БД. Я не вижу никаких признаков того, что служба не работает или имеет какие-либо ошибки, поэтому мне интересно, может быть, это потому, что служба PM 2 не может записывать в БД? Может проблема с портами? Любое руководство было бы потрясающим!
// -- Dependancies --
// Request and MongoDB
const request = require('request');
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
// Connect to database
mongoose.connect('mongodb://127.0.0.1:27017/stock-test')
.then(() => {
console.info('connected');
})
.catch(err => {
console.error(err);
});
// Setup stockMoment Schema
const StockMomentSchema = new Schema({
symbol: String,
price: Number,
size: Number,
time: {type: Date, default: Date.now}
});
// Create stockMoment model
StockMoment = mongoose.model('stockMoment', StockMomentSchema, 'stockPriceData');
// Setup Variables
const d = new Date();
let day = d.getDay()
let hour = d.getHours();
// Check time, run getMarketData function if market is open
function makeRequest() {
if (day >= 1 && day <= 5) {
if (hour >= 11 && hour <= 16) {
getMarketData();
}
}
}
// Run request to get data, store data in MongoDB database
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.info('Saved!', i);
});
console.info(body[i]);
}
});
}
setInterval(makeRequest, 300000);
Журналы PM2:
PM2 | [2018-08-27T23:05:42.936Z] PM2 log: RPC socket file : /home/evadmin/.pm2/rpc.sock
PM2 | [2018-08-27T23:05:42.937Z] PM2 log: BUS socket file : /home/evadmin/.pm2/pub.sock
PM2 | [2018-08-27T23:05:42.937Z] PM2 log: Application log path : /home/evadmin/.pm2/logs
PM2 | [2018-08-27T23:05:42.937Z] PM2 log: Process dump file : /home/evadmin/.pm2/dump.pm2
PM2 | [2018-08-27T23:05:42.937Z] PM2 log: Concurrent actions : 2
PM2 | [2018-08-27T23:05:42.937Z] PM2 log: SIGTERM timeout : 1600
PM2 | [2018-08-27T23:05:42.937Z] PM2 log: ===============================================================================
PM2 | [2018-08-27T23:05:42.972Z] PM2 log: Starting execution sequence in -fork mode- for app name:priceTimeSeries id:0
PM2 | [2018-08-27T23:05:42.977Z] PM2 log: App name:priceTimeSeries id:0 online
PM2 | [2018-08-27T23:08:02.026Z] PM2 log: Process 0 in a stopped status, starting it
PM2 | [2018-08-27T23:08:02.027Z] PM2 log: Stopping app:priceTimeSeries id:0
PM2 | [2018-08-27T23:08:02.042Z] PM2 log: App [priceTimeSeries] with id [0] and pid [1927], exited with code [0] via signal [SIGINT]
PM2 | [2018-08-27T23:08:02.139Z] PM2 log: pid=1927 msg=process killed
PM2 | [2018-08-27T23:08:02.140Z] PM2 log: Starting execution sequence in -fork mode- for app name:priceTimeSeries id:0
PM2 | [2018-08-27T23:08:02.145Z] PM2 log: App name:priceTimeSeries id:0 online
/home/evadmin/.pm2/logs/priceTimeSeries-error.log last 15 lines:
0|priceTim | (node:1927) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
0|priceTim | (node:2001) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
/home/evadmin/.pm2/logs/priceTimeSeries-out.log last 15 lines:
0|priceTim | connected
0|priceTim | connected
Там тоже не похоже, что что-то не так. Добавлю в пост. Я ценю помощь!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


У меня pm2 работает на сервере с mongoose / MongoDB, и проблем нет. Похоже, это может быть связано с тем, как вы обрабатываете создание модели мангуста.
Попробуйте сделать:
StockMoment.create({
symbol: body[i].symbol,
price: body[i].price,
size: body[i].size,
time: body[i].time,
});
https://mongoosejs.com/docs/models.html
Вам не нужно использовать сохранение при первоначальном создании документа.
Кроме того, я не знаю, насколько вы знакомы с mongo, но убедитесь, что вы выбрали базу данных с use stock-test в консоли. При выключенном изменении, когда вы используете python для чтения своей базы данных, вы также можете столкнуться с проблемой со знаком «-» из-за того, как python обрабатывает этот символ в своих словарях.
Я использую use dbName, спасибо за внимание. Я попытался изменить его на .create, но он, похоже, ничего не создает. Он просто останавливается после выполнения всех запросов ...
Собственно, похоже, что это работает. После редактирования файла мне пришлось перезапустить сервис. Не знал этого. Он успешно выполняет запрос и сохраняет файл. Просто нужно посмотреть, будет ли он работать в часы работы фондовой биржи. Спасибо за помощь!
Вы используете библиотеку обещаний с Mongoose? Я, честно говоря, никогда не настраивал без него, и вам понадобится await со всеми методами доступа к базе данных.
Очень хорошо! Я забываю об этом. Nodemon меня испортил (в разработке)
У меня также есть цифровой api, работающий как база данных службы / PM2 и mongodb. Все работает очень хорошо. Я посмотрю на ваш код. Проблема должна быть другая, в логах PM2 что показывает?
pm2 logsв bash.