我想把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.
你应该把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!");
});
});