пн goose: непрерывно сохранять данные - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь сохранить данные веб-сокета по мере их обновления в mongodb и иметь возможность запрашивать данные с помощью GQL! Мне придется переделать то, что у меня есть, но я просто немного не понимаю, как go об этом?

В любом случае, любая помощь будет принята с благодарностью <3 </p>

const mongoose = require('mongoose');

mongoose.connect("URI", {
  useNewUrlParser: true,
  useFindAndModify: false,
  useCreateIndex: true,
  useUnifiedTopology: true,
});


const { ApolloServer, PubSub, gql } = require('apollo-server');

const pubsub = new PubSub();

// saves in db as plural eg: btcusdklines ???
const BTCUSDkline = mongoose.model("BTCUSDkline",{
    time: Number,
    open: Number,
    high: Number,
    low: Number,
    close: Number,
});

const typeDefs = gql`
  type Query {
      getBTCUSDkline: [BTCUSDkline]
  }
  type BTCUSDkline {
      id: ID!
      time: Int
      open: Int
      high: Int
      low: Int
      close: Int
  }
`;

const resolvers = {
  Query: {
      getBTCUSDkline: ()=> BTCUSDkline.find(),
  },
}

const server = new ApolloServer({ 
  typeDefs, 
  resolvers,
});

server.listen().then(({ url }) => {
  console.log(`? server live @ ${url}`);
});

const ws = new WebsocketClient({key: API_KEY, secret: PRIVATE_KEY}, logger);

ws.subscribe(["klineV2.1.BTCUSD"]);

ws.on('open', function() {
    console.log('connection open');
});

ws.on('update', function(message) {
    const btcusdOpen = message.data[0].open;
    const btcusdClose = message.data[0].close;
    const btcusdHigh = message.data[0].high;
    const btcusdLow = message.data[0].low;
    const btcusdTime = message.data[0].timestamp;

    console.log(message);

    // define Schema
    var BTCUSDklineSchema = mongoose.Schema({
      time: Number,
      open: Number,
      high: Number,
      low: Number,
      close: Number,
    });
    // compile schema to model
    var Data = mongoose.model('Data', BTCUSDklineSchema, 'BTCUSDkline');

    // a document instance
    var data1 = new Data({ time:btcusdTime, open:btcusdOpen, high:btcusdHigh, low:btcusdLow, close: btcusdClose });

    // save model to database
    data1.save(function (data) {
      console.log("just saved to BTCUSDkline collection!");
    });

});

ws.on('response', function(response) {
    console.log('response', response);
});

ws.on('close', function() {
    console.log('connection closed');
}); 
ws.on('error', function(err) {
    console.error('ERR', err);
}); 

который работает в первый раз, но затем выдает следующую ошибку во второй раз:

throw new _mongoose.Error.OverwriteModelError(name);
      ^

OverwriteModelError: Cannot overwrite `Data` model once compiled.

1 Ответ

1 голос
/ 27 мая 2020

Вы должны поместить схемы вне функции, возможно, после вызова самого mon goose, чтобы они были ~ глобально ~ доступны с mon goose после их установки и компиляции.

Каждый раз, когда кто-то отправляет что-то через ws, функция пытается определить схему данных, которая уже была определена и скомпилирована mon goose раньше.

Вместо определения Schame внутри функция, например:

ws.on('update', function(message) {
    // ... message definition

    // define Schema
    var BTCUSDklineSchema = mongoose.Schema({
      time: Number,
      open: Number,
      high: Number,
      low: Number,
      close: Number,
    });
    // compile schema to model
    var Data = mongoose.model('Data', BTCUSDklineSchema, 'BTCUSDkline');

    // a document instance
    var data1 = new Data({ time:btcusdTime, open:btcusdOpen, high:btcusdHigh, low:btcusdLow, close: btcusdClose });

    // save model to database
    data1.save(function (data) {
      console.log("just saved to BTCUSDkline collection!");
    });
});

Вы должны установить схему вне любой функции, например:

// define Schema
const BTCUSDklineSchema = mongoose.Schema({
  time: Number,
  open: Number,
  high: Number,
  low: Number,
  close: Number,
});

// compile schema to model
const Data = mongoose.model('Data', BTCUSDklineSchema, 'BTCUSDkline');

ws.on('update', function(message) {
    // ... message definition

    // a document instance
    var data1 = new Data({ time:btcusdTime, open:btcusdOpen, high:btcusdHigh, low:btcusdLow, close: btcusdClose });

    // save model to database
    data1.save(function (data) {
      console.log("just saved to BTCUSDkline collection!");
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...