I need to schedule a mail every 6 hours whenever the user's balance falls below a threshold. I'm trying to use node-cron package but everytime my server restarts, I'm sure it will start rescheduling and I don't want that to happen.
Related
I have a node.js express app with MongoDB database and what I want is to be able to update the database based on time
Interval. For example
Increase a number field automatically every 7 days for each user based on an activation date set on each document.
Please how do I achieve this?
You can use cron jobs for that.
A cron job used for scheduling tasks to be executed sometime in the future at specific time interval.
Find out more here:
You will schedule a cron job that will run once in a day and you will add your code to be executed.
The What are Database Triggers? documentation indicates triggers, however it's not clear if that available on the free Community Edition, or only on their hosted Atlas offering. If you can't figure out a Mongo trigger solution, you would have to code a controller in Node.js based on .setInterval to fetch user creation date(s) then insert whatever update(s) you want on the user(s).
Types of Database Triggers MongoDB provides three types of triggers:
Database Triggers: Perform some type of action when a document is updated, added, or removed.
Scheduled Triggers: Scheduled actions that occur at a specific time or set interval. MongoDB Atlas leverages an intuitive approach to
scheduling triggers using the CRON expression language. These types of
triggers can be as simple as running a daily clean-up process of
temporary records, to generate a minute-by-minute report on
transaction anomalies.
Authentication Triggers (Realm only): Actions that happen when creating or deleting a user or on login into MongoDB. These types of
triggers are for performing user maintenance or user audit tracking
for Realm apps.
I am serving my users with data fetched from an external API. Now, I don't know when this API will have new data, how would be the best approach to do that using Node, for example?
I have tried setInterval's and node-schedule to do that and got it working, but isn't it expensive for the CPU? For example, over a day I would hit this endpoint to check for new data every minute, but it could have new data every five minutes or more.
The thing is, this external API isn't ran by me. Would the only way to check for updates hitting it every minute? Is there any module that can do that in Node or any approach that fits better?
Use case 1 : Call a weather API for every city of the country and just save data to my db when it is going to rain in a given city.
Use case 2 : Send notification to the user when a given Philips Hue lamp is turned on at the time it is turned on without having to hit the endpoint to check if it is on or not.
I appreciate the time to discuss this.
If this external API has no means of notifying you when there's new data, then the only thing you can do is to "poll" it to check for new data.
You will have to decide what an "efficient design" for polling is in your specific application and given the type of data and the needs of the client (what is an acceptable latency for new data).
You also need to be sure that your service is not violating any terms of service with your polling scheme or running afoul of rate limiting that may deny you access to the server if you use it "too much".
Would the only way to check for updates hitting it every minute?
Unless the API offers some notification feature, there is no other scheme other than polling at some interval. Polling every minute is fairly quick. Do your clients really need information that is less than a minute old? Or would it really make no difference if the information was as much as 5 minutes old.
For example, in your example of weather, a client wouldn't really need temperature updates more often than probably every 10-15 minutes.
Is there any module that can do that in Node or any approach that fits better?
No. Not really. You'll probably just use some sort of timer (either repeated setTimeout() or setInterval() in a node.js app to repeatedly carry out your API operations.
Use case: Call a weather API for every city of the country and just save data to my db when it is going to rain in a given city.
Trying to pre-save every possible piece of data from an external API is probably a losing proposition. You're essentially trying to "scrape" all the data from the external API. That is likely against the terms of service and will likely also run afoul of rate limits. And, it's just not very practical.
Instead, you will probably want to fetch data upon demand (when a client requests data for Phoenix, then, and only then, do you start collecting data for Phoenix) and then once a demand for a certain type of data (temperatures in a particular city) is established, then you might want to pre-cache that data more regularly so you can notify clients of changes. If, after awhile, no clients are asking for data from Phoenix, you stop requesting updates for Phoenix any more until a client establishes demand again.
I have tried setInterval's and node-schedule to do that and got it working, but isn't it expensive for the CPU? For example, over a day I would hit this endpoint to check for new data every minute, but it could have new data every five minutes or more.
Making a remote network request is not a CPU intensive operation, even if you're doing it every minute. node.js uses non-blocking networking so most of the time during a network request, node.js isn't doing anything and isn't using the CPU at all. The only time the CPU would be briefly used is when you first send the API request and then when you receive back the result from the API call and need to process it.
Whether you really need to "poll" every minute depends upon the data and the needs of the client. I'd ask yourself if your app will work just fine if you check for new data every 5 minutes.
The method I would use to update would be contained outside of the code in a scheduled batch/powershell/bash file. In windows you can schedule tasks based upon time of day or duration since last run, so what you could do is run a simple command that will kill your application for five minutes, run npm update, and then restart your application before closing the shell.
That way you're staying out of your API and keeping code to a minimum, and if your code is inside that Node package in the update, it'll be there and ready once you make serious application changes or you need to take the server down for maintenance and updates to the low-level code.
This is a light-weight solution for you and it's a method I've used once or twice at my workplace. There are lots of options out there, and if this isn't what you're looking for I can keep looking out for you.
I have an admin system where I can send emails with my lead info in it.
What I'm trying to achieve is an auto command where 10 minutes after I sent the email another email will be sent. The page with the action of sending the second email is ready, but how do I "activate" the action without logging into the system and do it manually?
I'm using IIS w. Classic ASP.
You'll need to use a batch file to schedule this task.
Run batch file from asp http://bytes.com/topic/asp-classic/answers/442265-asp-run-command-line
The batch command for scheduled tasks Make server automatic run asp-script every day
Here is how to add 5 minutes (or 10 minutes) to current time Adding to %TIME% variable in windows cmd script
I let you read and combine all that.
I want to schedule some code to be run at a variable time. For example, after 60 minutes I want to send an HTTP request to an endpoint and update a database document, but I also want to be able to cancel that code from being ran if an action occurs before that 60 minutes.
What is the best way to architect this? I want it to be able to survive server restarts and also to work if my app is scaled across multiple servers.
Thanks!
You would use setTimeout() for that and save the timer ID that it returns because you can then use that timer ID to cancel the timer. To schedule the timer:
var timer = setTimeout(myFunc, 60 * 60 * 1000);
Then, sometime later before the timer fires, you can cancel the timer with:
clearTimeout(timer);
If you want to survive server restarts, then you also need to save the actual system time that you want the timer to fire to some persistent store (like a config file on disk or database). Then, when your server starts, you read that value from the persistent store and, if it is set, then you set a new setTimeout() that will trigger at that time. Likewise, when the timer fires or when you clear the timer because you no longer need it, you then update the persistent store so there is no future time stored there.
You could make this all fairly clean to use by creating a persistentTimer object that had a method for setting the timer, clearing the timer and initializing from whatever persistent store you are using upon server restart.
We have a Nodejs server running on an AWS EC2 instance with MongoDB at the backend. We need to send email notifications to our users depending on certain time-specific criteria.
The simplest way is to setup another instance and run a cron job on it every midnight. Go through all users one by one and dispatch emails if they fit the criteria.
This seems to be a pretty non-optimal solution as we have thousands of users. Is there any other way of doing this?