使用NodeJS自动将数据插入MongoDB

时间:2020-06-08 09:48:22

标签: node.js mongodb

我正在尝试创建一个脚本,该脚本将每天在特定时间自动从API发送数据并将其存储在MongoDB集合中。为此,我使用NodeJS-Schedule

我刚刚开始探索MongoDB,现在我正在寻找一种自动从API接收数据并将其存储在MongoDB中的方法。

我看到有MongoDB-Cron

这是我用来从API接收数据的代码的一部分。

var j = schedule.scheduleJob("*/55 20 * * *", function() {
    request(
            "GET",
            "http://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest?CMC_PRO_API_KEY=API-KEY-HERE"
        )
        .then((r1) => {
            var x1 = JSON.parse(r1.target.responseText);

            var BTCdata = x1.data.find((d) => d.symbol === "BTC").quote.USD.volume_24h; // creating a variable to store a BTC request from API

            console.log(BTCdata);
        })
        .catch((err) => {
            console.log(err);
        });
});

function request(method, url) {
    return new Promise(function(resolve, reject) {
        var xhr = new XMLHttpRequest();
        xhr.open(method, url);
        xhr.onload = resolve;
        xhr.onerror = reject;
        xhr.send();
    });
}

这是向MongoDB集合插入数据的部分。

我有点不了解如何自动执行此插入函数,我是否可以使这种自动化方式每天在特定时间将数据发送到mongodb?

var url = "mongodb+srv://name:password@cluster0-1kunr.mongodb.net/<dbname>?retryWrites=true&w=majority";

MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, db) {
    if (err) throw err;
    var dbo = db.db("Crypto");
    var myobj = { Name: "BTC", Volume: "BTCdata" };
    dbo.collection("Crypto-Values").insertOne(myobj, function(err, res) {
        if (err) throw err;
        console.log("1 document inserted");
        db.close();
    });
});

EDIT1: 代码应该是这样的吗?

var MongoClient = require('mongodb').MongoClient;
var MongoCron = require('mongodb-cron');

const saveToDatabase = (BTCdata) => {
    var url = "mongodb+srv://name:password@cluster0-1kunr.mongodb.net/<dbname>?retryWrites=true&w=majority";

    MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, db) {
        var j = schedule.scheduleJob("*/55 20 * * *", function() {
            request(
                    "GET",
                    "http://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest?CMC_PRO_API_KEY=API-KEY-HERE"
                )
                .then((r1) => {
                    var x1 = JSON.parse(r1.target.responseText);

                    var BTCdata = x1.data.find((d) => d.symbol === "BTC").quote.USD.volume_24h; // creating a variable to store a BTC request from API


                    console.log(BTCdata);
                    // Saving to database
                    saveToDatabase(BTCdata);
                })
                .catch((err) => {
                    console.log(err);
                });
        });
    });
};

1 个答案:

答案 0 :(得分:0)

我认为您无需干扰数据库插入的自动化,您可以将插入内容包括在玉米作业本身中。也许,将数据持久性逻辑封装在一个函数中:

const saveToDatabase = (BTCdata) => {
  var url = "mongodb+srv://name:password@cluster0-1kunr.mongodb.net/<dbname>?retryWrites=true&w=majority";

  MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, db) {
    if (err) throw err;
    var dbo = db.db("Crypto");
    var myobj = { Name: "BTC", Volume: BTCdata };
    dbo.collection("Crypto-Values").insertOne(myobj, function(err, res) {
        if (err) throw err;
        console.log("1 document inserted");
        db.close();
    });
  });
}

在玉米作业中的API调用之后,应使用BTCData调用函数。该程序应该是这样的:

const { MongoClient } = require('mongodb');
const schedule = require('node-schedule');

const saveToDatabase = function (BTCdata) {
  const url = 'mongodb+srv://name:password@cluster0-1kunr.mongodb.net/<dbname>?retryWrites=true&w=majority';

  MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
    if (err) throw err;
    const dbo = db.db('Crypto');
    const myobj = { Name: 'BTC', Volume: BTCdata };
    dbo.collection('Crypto-Values').insertOne(myobj, (error, res) => {
      if (error) throw error;
      console.log('1 document inserted');
      db.close();
    });
  });
};

function request(method, url) {
  return new Promise(((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open(method, url);
    xhr.onload = resolve;
    xhr.onerror = reject;
    xhr.send();
  }));
}

const j = schedule.scheduleJob('*/55 20 * * *', () => {
  request(
    'GET',
    'http://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest?CMC_PRO_API_KEY=API-KEY-HERE',
  )
    .then((r1) => {
      const x1 = JSON.parse(r1.target.responseText);

      const BTCdata = x1.data.find((d) => d.symbol === 'BTC').quote.USD.volume_24h; // creating a variable to store a BTC request from API


      console.log(BTCdata);
      // Saving to database
      saveToDatabase(BTCdata);
    })
    .catch((err) => {
      console.log(err);
    });
});

记住在必要时捕获错误