猫鼬:连续保存数据

时间:2020-05-26 20:23:30

标签: node.js mongoose websocket apollo apollo-server

我正在尝试将websocket数据作为更新保存到mongodb中,并能够使用GQL查询数据!我必须重做我现有的东西,但是我对如何解决这个问题感到有些困惑?

无论如何,任何帮助将不胜感激<3

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 个答案:

答案 0 :(得分:1)

您应该将Schemas放在函数之外,也许在调用mongoose本身之后,这样,一旦设置和编译它们,它们就可以从mongoose全局使用。

每次有人通过ws发送某些内容时,该函数都会尝试定义数据模式,该数据模式以前已经由mongoose定义和编译。

不是在函数内定义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!");
    });
});

您应该在任何函数之外设置Schema,如下所示:

// 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!");
    });
});