mongoose:持续保存数据

问题描述 投票:0回答:1

我想把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.
node.js mongoose websocket apollo apollo-server
1个回答
1
投票

你应该把Schemas放在函数之外,也许是在调用mongoose本身之后,这样一旦它们被设置和编译,它们就会从mongoose中~全球~可用。

每次有人通过ws发送东西时,函数都会尝试定义数据Schema,而这个数据Schema之前已经被mongoose定义和编译过了。

与其像这样在函数内部定义Schema。

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!");
    });
});
© www.soinside.com 2019 - 2024. All rights reserved.