【问题标题】:How to update an sqlite3 database every 30 seconds from an express server using an external api如何使用外部 api 从快速服务器每 30 秒更新一次 sqlite3 数据库
【发布时间】:2021-09-15 12:23:19
【问题描述】:

我正在创建一个跟踪游戏中的击杀统计数据的网站,但我每次请求只能访问 50 个键值对,因此为了确保我的数据准确,我想大约每 30 秒发出一次请求。

我觉得我可能在实施的某个阶段出错了。就像,也许有一种方法可以发出不涉及使用的请求 express.get('/route/', (req, res) => { //code }) 语法,我只是不知道。简而言之,我想要的是数据库每 30 秒更新一次,而无需刷新浏览器。我已经尝试将我的 get 请求包装在一个函数中并将其置于设定的时间间隔内,但它仍然没有运行。

const express = require('express');
const zkillRouter = express.Router();
const axios = require('axios');
const zkillDbInit = require('../utils/zkillTableInit');
const sqlite3 = require('sqlite3').verbose();

zkillDbInit();

let db = new sqlite3.Database('zkill.db');

setInterval(() => {
    zkillRouter.get('/', (req, res)=>{
        axios.get('https://zkillboard.com/api/kills/w-space/', {headers: {
            'accept-encoding':'gzip',
            'user-agent': 'me',
            'connection': 'close'
        }})
            .then(response => {
            // handle success
                const wormholeData = (response.data)
                res.status(200);
                //probably not the best way to do this but it's fine for now.
                for (let i = 0; i < Object.keys(wormholeData).length; i++) {
                    const currentZKillId = Object.keys(wormholeData)[i]
                    const currentHash = Object.values(wormholeData)[i]
                    let values = {
                        $zkill_id: currentZKillId,
                        $hash: currentHash
                    };
                    //puts it in the database
                    db.run(`INSERT INTO zkill (zkill_id, hash) VALUES ($zkill_id, $hash)`,
                    values
                    , function(err){
                        if(err){
                            throw(err)
                        }
                    })
                }
        })
    })
}, 1000)

module.exports = zkillRouter;

我考虑过的一件事是,我不一定需要此功能成为同一个程序的一部分。我所需要的只是数据库,所以如果必须的话,我可以单独运行此代码,例如,终端只是一个小节点程序,它向 api 发出请求并更新数据库。我认为这不是理想的,但如果这是做我想做的唯一方法,那么我会考虑它。

澄清:.get() 方法是在 zkillRouter 上调用的,它是在第二行声明的 express.Router() 的一个实例。这反过来又通过 apiRouter 链接回我的 app.js 文件,因此完整的路由是 localhost:5000/api/zkill/。这是问题的很大一部分,我不知道你可以在不指定路由的情况下调用 axios.get,所以我被困了一段时间。

【问题讨论】:

  • edit澄清您的问题。是什么调用了您在示例代码中定义的 .get() 路由方法?

标签: node.js http backend setinterval node-sqlite3


【解决方案1】:

我自己修好了。

(编辑 4)

  1. 我使用 setInterval 错误。
  2. 我刚刚删除了 router 语句,因为它不需要。
  3. 我肯定需要调整间隔,这样我就不会因为违反唯一约束而收到太多 sql 错误。我认为每 5 分钟就足够了。
  4. 不要抛出错误。
function myfunction(){
        axios.get('https://zkillboard.com/api/kills/w-space/', {headers: {
            'accept-encoding':'gzip',
            'user-agent': 'me lol',
            'connection': 'close'
        }})
            .then(response => {
            // handle success
                const wormholeData = (response.data)
                for (let i = 0; i < Object.keys(wormholeData).length; i++) {
                    const currentZKillId = Object.keys(wormholeData)[i]
                    const currentHash = Object.values(wormholeData)[i]
                    let values = {
                        $zkill_id: currentZKillId,
                        $hash: currentHash
                    };
                    db.run(`INSERT INTO zkill (zkill_id, hash) VALUES ($zkill_id, $hash)`,
                    values
                    , function(err){
                        if(err){
                            return console.log(i);
                        }
                    })
                }
        })
}

setInterval(myfunction, 1000 * 30)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多