ฉันต้องการตัวกำหนดตารางเวลา Nodejs ที่อนุญาตให้ทำงานในช่วงเวลาต่างๆ [ปิด]


127

ฉันกำลังมองหาตารางงานโหนดที่จะช่วยให้ฉันกำหนดเวลางานจำนวนมากในช่วงเวลาต่างๆได้ ตัวอย่างเช่น

  • ฟังก์ชั่นการโทร A ทุก ๆ 30 วินาที
  • เรียกใช้ฟังก์ชัน B ทุก 60 วินาที
  • เรียกฟังก์ชัน C ทุก 7 วัน

ฉันยังต้องการที่จะสามารถเริ่มและหยุดกระบวนการนี้ได้

จนถึงตอนนี้ฉันได้ดู:

  • ในภายหลัง - ไวยากรณ์ทำให้ฉันสับสนและดูเหมือนว่าคุณไม่สามารถกำหนดเวลางานเกินหนึ่งเดือนได้

  • วาระการประชุม - ดูเหมือนจะมีแนวโน้มมากที่สุด แต่ฉันสับสนเกี่ยวกับฟังก์ชันการทำงานของฐานข้อมูล

  • แผนเวลา - ง่ายเกินไปเริ่มและหยุดไม่ได้

ฉันพบว่าไวยากรณ์ของประโยคหลังสับสน


1
แค่ใช้ setInterval ดูเหมือนว่าคุณจะทำอะไร?
adeneo

ใช่ทำไมไม่ใช้ setInterval?
Yalamber

ฉันรู้ว่าภายใต้ประทุนบางส่วนของการใช้ setInterval เหล่านี้ แต่ฉันกำลังมองหาบางสิ่งที่ระดับสูงขึ้นเล็กน้อย ... ฉันเคยใช้ตาราง ( github.com/dbader/schedule ) ใน python และฉันกำลังมองหาโหนด อะนาล็อกไปที่
user379468

ลองใช้ TaskTimer - github.com/onury/tasktimer
Onur Yıldırım

ฉันใช้วาระการประชุมไม่ใช่เรื่องเลวร้าย
Aleksandr Golovatyi

คำตอบ:


223

node-cronฉันจะแนะนำ อนุญาตให้รันงานโดยใช้รูปแบบ Cron เช่น

'* * * * * *' - runs every second
'*/5 * * * * *' - runs every 5 seconds
'10,20,30 * * * * *' - run at 10th, 20th and 30th second of every minute
'0 * * * * *' - runs every minute
'0 0 * * * *' - runs every hour (at 0 minutes and 0 seconds)

แต่ยังมีตารางเวลาที่ซับซ้อนมากขึ้นเช่น

'00 30 11 * * 1-5' - Runs every weekday (Monday through Friday) at 11:30:00 AM. It does not run on Saturday or Sunday.

โค้ดตัวอย่าง : ทำงานทุก 10 นาที:

var cron = require('cron');
var cronJob = cron.job("0 */10 * * * *", function(){
    // perform operation e.g. GET request http.get() etc.
    console.info('cron job completed');
}); 
cronJob.start();

คุณสามารถดูตัวอย่างเพิ่มเติมได้ในnode-cron wiki

สามารถดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่า cron ได้ในcron wiki

ฉันใช้ไลบรารีนั้นในหลายโครงการและได้ผล ฉันหวังว่าจะช่วยได้


ตกลงฉันกลัวไวยากรณ์ cron แต่ดูเหมือนว่าจะเป็นแนวทางที่ดีที่สุด
user379468

1
รอฉันคุยด้วยเร็ว ๆ นี้ฉันจะเขียน cron ที่ทำงานทุกๆ 5 วินาทีหรือทุก ๆ 30 วินาทีได้อย่างไร
user379468

3
ไวยากรณ์ cron อาจจะดูน่ากลัว ในทางกลับกันมันมีอยู่เป็นเวลานานและเป็นที่รู้จักอย่างกว้างขวางดังนั้นจะได้รับการสนับสนุนมากมายใน SO
Tom

1
เพิ่งอัปเดตคำตอบของฉันดังนั้นมันจะเป็น - '* / 5 * * * * *' - ทุก 5 วินาทีหรือ '* / 30 * * * * *' วินาที
ทอม

1
ในปี 2020 และตามหน้า npm อย่างเป็นทางการของnode-cron การใช้แพ็คเกจนี้ได้ลดลง แพ็คเกจนี้เผยแพร่ครั้งล่าสุดใน npm เมื่อ 2 ปีก่อนจึงไม่มีการอัปเดตเป็นประจำ ตอนนี้ควรเลือกใช้node-cronแพ็กเกจอื่นซึ่งดูเหมือนจะมีชื่อเหมือนกัน แต่ควรใช้ URL ที่แตกต่างกัน
n0noob

36

ผมเคยใช้โหนด cronและวาระการประชุม

node-cronเป็นไลบรารีที่เรียบง่ายซึ่งมี api ขั้นพื้นฐานและเข้าใจง่ายเช่น crontab ไม่จำเป็นต้องกำหนดค่าใด ๆ และใช้งานได้จริง

var cronJob = require('cron').CronJob;
var myJob = new cronJob('00 30 11 * * 1-5', function(){...});
myJob.start();

วาระการประชุมมีประสิทธิภาพมากและเหมาะสมกับบริการที่ซับซ้อนมากขึ้น ลองนึกถึงiftttคุณต้องทำงานหลายล้านอย่าง วาระการประชุมจะเป็นทางเลือกที่ดีที่สุด

หมายเหตุ: คุณต้องใช้Mongodbเพื่อใช้ Agenda

var Agenda = require("Agenda");
var agenda = new Agenda({db: { address: 'localhost:27017/agenda-example'}});
agenda.every('*/3 * * * *', 'delete old users');
agenda.start();

1
ด้วยเหตุผลบางประการเมื่อฉันพยายามใช้ Agenda ฉันได้รับข้อผิดพลาด ReferenceError: Agenda ไม่ได้กำหนดไว้ ฉันติดตั้งแพ็กเกจด้วย NPM ฉันต้องทำอะไรก่อนที่จะอินสแตนซ์กำหนดการหรือไม่
user379468

2
ฉันคิดว่าคุณต้องกำหนดให้ตัวแปรท้องถิ่นของคุณ var Agenda = ต้องใช้ ("Agenda");
Ryan Wu

1
ฉันเพิ่งเขียนบล็อกความคิดเห็นเกี่ยวกับวาระการประชุมการตั้งค่าโครงการและโครงสร้างโครงการgoo.gl/5sCNBM
Robin Wieruch

1
โปรดทราบว่าคุณต้องใช้ Mongodb เพื่อใช้ Agenda
Mark Robson

1
โหนด cron หรือวาระการประชุมวางกระบวนการระบบโหนดแยกกันหรือไม่? คุณสามารถใช้มันในการตั้งค่ากระบวนการหลายโหนดได้หรือไม่?
Prasad Silva

14

ฉันคิดว่าอันดับที่ดีที่สุดคือ

1.node ตาราง

2.later

3.crontab

และตัวอย่างตารางโหนดอยู่ด้านล่าง:

var schedule = require("node-schedule");
var rule = new schedule.RecurrenceRule();
//rule.minute = 40;
rule.second = 10;
var jj = schedule.scheduleJob(rule, function(){
    console.log("execute jj");
});

บางทีคุณอาจจะสามารถหาคำตอบได้จากโมดูลโหนด


1
รักไวยากรณ์ขอบคุณสำหรับการแบ่งปัน
Overdrivr

10

ฉันได้เขียนโมดูลโหนดที่จัดเตรียม wrapper รอบ setInterval โดยใช้ช่วงเวลาที่จัดเตรียมอินเทอร์เฟซที่เปิดเผย:

npm ติดตั้งทุกช่วงเวลา

var every = require('every-moment');

var timer = every(5, 'seconds', function() {
    console.log(this.duration);
});

every(2, 'weeks', function() {
    console.log(this.duration);
    timer.stop();
    this.set(1, 'week');
    this.start();
});

https://www.npmjs.com/package/every-moment

https://github.com/raygerrard/every-moment


4
ลิงก์ github เสีย (404)
kekko12

นี้สามารถอ่านได้มาก ฉันได้เขียนแพ็คเกจที่ใช้node-cronเป็นคำตอบ @Tom และมีไวยากรณ์ที่ดีคล้ายกับของคุณ reel().call(() => console.log('hello !!')).everyMinute().run() github.com/shakee93/node-reel
shakee93

@ kekko12 มีใน NPM: npmjs.com/package/every-moment
Ali Hesari


1

ฉันได้เขียนโมดูลเล็ก ๆ เพื่อทำสิ่งนั้นเรียกว่าtimexe :

  • รหัสที่เรียบง่ายเชื่อถือได้ขนาดเล็กและไม่มีการอ้างอิง
  • ความละเอียดเป็นมิลลิวินาทีและมีความแม่นยำสูงเมื่อเวลาผ่านไป
  • Cron เหมือน แต่เข้ากันไม่ได้ (คำสั่งย้อนกลับและการปรับปรุงอื่น ๆ )
  • ฉันทำงานในเบราว์เซอร์ด้วย

ติดตั้ง:

npm install timexe

ใช้:

var timexe = require('timexe');
//Every 30 sec
var res1=timexe(”* * * * * /30”, function() console.log(“Its time again”)});

//Every minute
var res2=timexe(”* * * * *”,function() console.log(“a minute has passed”)});

//Every 7 days
var res3=timexe(”* y/7”,function() console.log(“its the 7th day”)});

//Every Wednesdays 
var res3=timexe(”* * w3”,function() console.log(“its Wednesdays”)});

// Stop "every 30 sec. timer"
timexe.remove(res1.id);

คุณสามารถบรรลุฟังก์ชันเริ่มต้น / หยุดได้โดยการลบ / เพิ่มรายการใหม่โดยตรงในอาร์เรย์งาน timexe แต่ไม่ใช่ฟังก์ชันด่วน


4
คุณควรระบุว่าคุณเป็นผู้เขียน
20

13
@ a20 "ได้เขียนโมดูลเล็ก ๆ เพื่อทำสิ่งนั้น" หมายความว่าเขาเป็นผู้เขียนในกรณีที่คุณข้ามขณะอ่าน
PirateApp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.