Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 难点:牛头工作有时开始,有时不';T_Node.js_Redis_Jobs - Fatal编程技术网

Node.js 难点:牛头工作有时开始,有时不';T

Node.js 难点:牛头工作有时开始,有时不';T,node.js,redis,jobs,Node.js,Redis,Jobs,我已经使用cron实现了一个Redis和一个microservice,每隔1小时运行一次。有时工作开始了,有时没有,我真的不知道为什么会发生这种情况 我有一个启动后端rest api的server.js文件,一个处理队列的queue.js文件和一个将作业添加到队列的rates.js文件: server.js: import express from "express"; import cors from "cors"; import morgan from "morgan"; import Bu

我已经使用cron实现了一个Redis和一个microservice,每隔1小时运行一次。有时工作开始了,有时没有,我真的不知道为什么会发生这种情况

我有一个启动后端rest api的
server.js
文件,一个处理
队列的
queue.js
文件和一个将作业添加到
队列的
rates.js
文件:

server.js:

import express from "express";
import cors from "cors";
import morgan from "morgan";
import BullBoard from "bull-board";
import Queue from "./lib/Queue.js";
import routes from "./routes.js";
const app = express();

app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// use morgan if in development
if (process.env.ENVIRONMENT === "development") app.use(morgan("dev"));

// starts the Bull Dashboard
BullBoard.setQueues(Queue.queues.map(queue => queue.bull));

app.use("/api", routes);
app.use("/admin/queues", BullBoard.UI);

app.listen(3333);
queue.js:

import Queue from "./lib/Queue.js";

Queue.process();
rate.js:

import rateJobs from "./jobs/exchangeRates/addToQueue.js";
import Queue from "./lib/Queue.js";

// clean queues
Queue.empty("SetArgentinaRate");
Queue.empty("SetBtcPrice");
Queue.empty("SetBrazilRate");
Queue.empty("SetIndiaRate");
Queue.empty("SetSouthAfricaRate");
Queue.empty("SetVenezuelaRate");

// add job to check rates
Object.keys(rateJobs).forEach(job => job);
lib/Queue.js
将所有作业导入单个对象:

import Queue from "bull";
import redisConfig from "../config/redis.js";

import * as jobs from "../jobs/index.js";

const queues = Object.values(jobs).map(job => ({
    bull: new Queue(job.key, { redis: redisConfig }),
    name: job.key,
    handle: job.handle,
    options: job.options
}));

export default {
    queues,
    add(name, data) {
        const queue = this.queues.find(queue => queue.name === name);

        return queue.bull.add(data, queue.options);
    },
    empty(name) {
        const queue = this.queues.find(queue => queue.name === name);

        return queue.bull.empty();
    },
    process() {
        return this.queues.forEach(queue => {
            queue.bull.process(queue.handle);
        });
    }
};
其中一项工作是设置汇率:

import Currencies from "../../models/currencies.js";
import rp from "request-promise";

export default {
    key: "SetArgentinaRate",
    options: {
        repeat: { cron: "0 * * * *" },
        backoff: { type: "exponential", delay: 30000 },
        attempts: 10
    },
    async handle() {
        // Promise all to get btc price in dest country, spread and btc price
        const [btcArs, { spread }, btc] = await Promise.all([
            rp.get({
                uri:
                    "https://localbitcoins.com/bitcoinaverage/ticker-all-currencies/",
                json: true
            }),
            Currencies.findOne({ currency: "ARS" }).select("spread"),
            Currencies.findOne({ currency: "BTC" }).select("exchange_rate")
        ]);

        // calculate exchange rate
        const exchange_rate = (
            (btcArs.ARS.avg_1h / btc.exchange_rate) *
            (1 - spread)
        ).toFixed(2);

        // set exchange rate to database
        await Currencies.findOneAndUpdate(
            { currency: "ARS" },
            {
                exchange_rate,
                lastUpdate: Date.now(),
                $push: {
                    history: {
                        date: Date.now(),
                        rate: exchange_rate
                    }
                }
            }
        );
    }
};
下面是一个
codesandbox
示例:它没有完全发挥功能,因为没有运行redis实例,但它与我实现的相同

当作业运行时,它们执行时不会出错

我使用
npm run all
并行启动3个微服务:

"prod:server": "node --require dotenv/config src/server.js",
"prod:queue": "node --require dotenv/config src/queue.js",
"prod:rates": "node --require dotenv/config src/rates.js",
"start": "npm-run-all -p prod:*",
在本地主机上,作业有时启动,有时不启动。在生产过程中,他们从未开始。我不明白为什么

感谢您的帮助。提前谢谢