Tôi cần một bộ lập lịch Nodejs cho phép thực hiện các tác vụ ở các khoảng thời gian khác nhau [đóng]


127

Tôi đang tìm kiếm một lịch trình công việc nút cho phép tôi lên lịch một số nhiệm vụ theo các khoảng thời gian khác nhau. Ví dụ,

  • chức năng gọi A cứ sau 30 giây
  • gọi hàm B cứ sau 60 giây
  • gọi chức năng C cứ sau 7 ngày

Tôi cũng muốn có thể bắt đầu và dừng quá trình.

Cho đến nay, tôi đã xem xét:

  • sau này - cú pháp làm tôi bối rối, cũng có vẻ như bạn không thể lên lịch các nhiệm vụ sau một tháng

  • chương trình nghị sự - có vẻ hứa hẹn nhất, tuy nhiên tôi bối rối về chức năng cơ sở dữ liệu

  • timeplan - quá đơn giản, không thể bắt đầu và dừng lại

Tôi tìm thấy cú pháp của sau khó hiểu.


1
Còn về việc sử dụng setInterval, nghe có vẻ chính xác những gì bạn đang theo đuổi?
adeneo

Có tại sao không sử dụng setInterval?
Yalamber

Tôi biết rằng trong số này, một số trong số này sử dụng setInterval, nhưng tôi đang tìm kiếm thứ gì đó cao hơn một chút ... Tôi đã sử dụng lịch trình ( github.com/dbader/schedule ) trong python và tôi đang tìm kiếm một nút tương tự như vậy
dùng379468

Hãy dùng thử TaskTimer - github.com/onury/tasktimer
Onur Yıldırım

Tôi đã sử dụng chương trình nghị sự, không tệ
Aleksandr Golovatyi

Câu trả lời:


223

Tôi muốn giới thiệu node-cron. Nó cho phép chạy các tác vụ bằng cách sử dụng các mẫu Cron, vd

'* * * * * *' - 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)

Nhưng lịch trình cũng phức tạp hơn, vd

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

Mã mẫu : công việc đang chạy cứ sau 10 phút:

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();

Bạn có thể tìm thấy nhiều ví dụ hơn trong wiki nút-cron

Thông tin thêm về cấu hình cron có thể được tìm thấy trên wiki cron

Tôi đã sử dụng thư viện đó trong nhiều dự án và nó thực hiện công việc. Tôi hy vọng điều đó sẽ giúp.


ok, tôi đã bị đe dọa bởi cú pháp cron, nhưng đây có vẻ là cách tiếp cận tốt nhất
user379468

1
chờ tôi nói chuyện sớm, làm thế nào để tôi viết một cron chạy cứ sau 5 giây hoặc cứ sau 30 giây?
dùng379468

3
cú pháp cron có thể trông đáng sợ . Mặt khác, nó tồn tại trong một thời gian dài và được biết đến rộng rãi vì vậy sẽ nhận được rất nhiều sự hỗ trợ trên SO
Tom

1
Chỉ cần cập nhật phản hồi của tôi để nó sẽ là - '* / 5 * * * * *' - cứ sau 5 giây hoặc '* / 30 * * * * *' giây
Tom

1
Kể từ năm 2020 và theo trang npm chính thức của nút-cron , việc sử dụng gói này đã không còn nữa. Gói này được xuất bản lần cuối vào npm 2 năm trước, do đó không được cập nhật thường xuyên. Bây giờ, thay vào đó là một nút-cron gói khác có cùng tên nhưng được sử dụng bởi các URL khác nhau nên được ưu tiên.
n0noob

36

Tôi đã sử dụng nút-cronchương trình nghị sự .

node-cron là một thư viện rất đơn giản, cung cấp api rất cơ bản và dễ hiểu như crontab. Nó không cần bất kỳ cấu hình và chỉ hoạt động.

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

chương trình nghị sự rất mạnh mẽ và phù hợp với các dịch vụ phức tạp hơn nhiều. Hãy nghĩ về ifttt , bạn phải chạy hàng triệu nhiệm vụ. chương trình nghị sự sẽ là sự lựa chọn tốt nhất.

Lưu ý: Bạn cần Mongodb để sử dụng Chương trình nghị sự

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

1
vì một số lý do, khi tôi cố gắng sử dụng Chương trình nghị sự, tôi gặp lỗi ReferenceError: Chương trình nghị sự không được xác định. Tôi đã cài đặt gói với NPM, tôi có phải làm gì trước khi bắt đầu chương trình nghị sự không?
dùng379468

2
tôi nghĩ rằng bạn phải yêu cầu nó cho biến cục bộ của bạn. var Agenda = Yêu cầu ("Chương trình nghị sự");
Ryan Wu

1
Gần đây tôi đã viết một bình luận blog về chương trình nghị sự, thiết lập dự án và cấu trúc dự án goo.gl/5sCNBM
Robin Wieruch

1
Lưu ý rằng bạn cần Mongodb chạy để sử dụng Chương trình nghị sự
Mark Robson

1
Do nút-cron hoặc chương trình nghị sự sinh ra một quy trình hệ thống nút riêng biệt? Bạn có thể sử dụng chúng trong một thiết lập quy trình nhiều nút không?
Prasad Silva

14

Tôi nghĩ thứ hạng tốt nhất là

1.node-lịch trình

2.later

3.crontab

và mẫu của lịch trình nút bên dưới:

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");
});

Có lẽ bạn có thể tìm thấy câu trả lời từ các mô-đun nút .


1
Yêu cú pháp, cảm ơn vì đã chia sẻ
Overdrivr

10

Tôi đã viết một mô-đun nút cung cấp trình bao bọc xung quanh setInterval bằng cách sử dụng thời lượng cung cấp giao diện khai báo:

npm cài đặt mọi lúc

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
Liên kết github bị hỏng (404)
kekko12

cái này dễ đọc tôi đã viết một gói sử dụng node-cronnhư câu trả lời @Tom. và có một cú pháp đẹp tương tự như của bạn. reel().call(() => console.log('hello !!')).everyMinute().run() github.com/shakee93/node-reel
Shakee93

@ kekko12 Có trên NPM: npmjs.com/package/every-moment
Ali Hesari


1

Tôi đã viết một mô-đun nhỏ để làm việc đó, được gọi là timexe :

  • Mã đơn giản, nhỏ đáng tin cậy và không có phụ thuộc
  • Độ phân giải tính bằng mili giây và có độ chính xác cao theo thời gian
  • Cron thích, nhưng không tương thích (thứ tự đảo ngược và các cải tiến khác)
  • Tôi cũng làm việc trong trình duyệt

Tải về:

npm install timexe

sử dụng:

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);

bạn có thể đạt được chức năng start / stop bằng cách loại bỏ / thêm lại mục nhập trực tiếp trong mảng công việc timexe. Nhưng nó không phải là một chức năng rõ ràng.


4
Bạn nên đề cập rằng bạn là tác giả.
a20

13
@ a20 "đã viết một mô-đun nhỏ để làm việc đó." có nghĩa là anh ấy là tác giả trong trường hợp bạn bỏ qua trong khi đọc
PirateApp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.