Een bot die in Node.js is geschreven, draait bij ons onafgebroken en start na een crash vanzelf opnieuw. We laten zien hoe je het project op je computer voorbereidt, wat je wel en niet uploadt, hoe je het starten instelt en hoe je de Node.js-versie opzoekt.
Wat je nodig hebt
- Een Discord-bot bij StormHost
- De code van de bot in JavaScript (Node.js), het liefst getest op je computer
- Het token van de bot uit het Discord Developer Portal (handleiding)
- Ongeveer 15 minuten
Hoe de bot bij ons draait#
- De omgeving is Node.js. De bot is een gewone Node.js-applicatie, meestal met de bibliotheek discord.js.
- De bestanden van de bot beheer je op het tabblad Bestanden (bestandsbeheer in de browser).
- Het starten wordt bepaald op het tabblad Instellingen: Opstartcommando (het volledige commando, alleen-lezen) en Variabelen (bijvoorbeeld de naam van het hoofdbestand).
- De uitvoer van de bot (alles uit
console.logen fouten) zie je op het tabblad Console, daar staan ook de knoppen Starten, Herstarten en Stoppen. - Automatische herstart: als de bot crasht, start hij opnieuw. Hij draait 24 uur per dag, ook als je computer uitstaat.
- Het geheugen is beperkt op basis van je pakket. Het gebruik zie je onder de console.
Het project voorbereiden op je computer#
Aanbevolen projectstructuur:
muj-bot/
├── package.json
├── package-lock.json
├── index.js
├── deploy-commands.js
├── .env
├── .gitignore
├── commands/
│ └── utility/
│ └── ping.js
└── node_modules/package.json#
package.json beschrijft het project: hoe het heet, welk bestand wordt gestart en welke pakketten het nodig heeft. Je maakt het aan in de projectmap met het commando npm init -y en voegt pakketten toe met het commando npm install discord.js dotenv. Pas het resultaat ongeveer zo aan:
{
"name": "muj-bot",
"version": "1.0.0",
"private": true,
"main": "index.js",
"type": "commonjs",
"scripts": {
"start": "node index.js"
},
"engines": {
"node": ">=18"
},
"dependencies": {
"discord.js": "^14.27.0",
"dotenv": "^18.0.5"
}
}| Veld | Wat het doet | Wat je instelt |
|---|---|---|
name | De naam van het project. Kleine letters, zonder spaties. | Vrij te kiezen, bijvoorbeeld muj-bot. |
version | De versie van je bot. | 1.0.0, bij wijzigingen kun je die verhogen. |
private | true voorkomt dat je het project per ongeluk in het npm-register publiceert. | true |
main | Het hoofdbestand waarmee de bot begint. | Hetzelfde bestand dat je start, meestal index.js. |
type | commonjs = de code gebruikt require(), module = de code gebruikt import. | Afhankelijk van je code. De handleidingen van discord.js gebruiken commonjs. |
scripts.start | Het commando voor npm start op je computer. | node index.js |
engines.node | Informatie over welke Node.js-versie de bot nodig heeft. Het verandert de versie niet, het waarschuwt alleen. | >=18 voor discord.js 14. |
dependencies | De pakketten die de bot nodig heeft, met versies. ^14.27.0 betekent “14.27.0 of een nieuwere 14.x”. | Worden ingevuld door npm install <PAKKET>, typ ze niet met de hand. |
Het bestand package-lock.json ontstaat vanzelf en legt de exacte versies van alle pakketten vast. Upload het samen met package.json naar de server, zodat op de server dezelfde versies worden geïnstalleerd als op je computer.
JSON verdraagt geen fouten
In package.json moeten sleutels en teksten tussen dubbele aanhalingstekens staan, na de laatste regel van een blok mag geen komma staan en opmerkingen zijn niet toegestaan. Eén fout en de installatie van de pakketten eindigt met de fout EJSONPARSE.
Wat je wel en niet uploadt#
| Bestand of map | Uploaden? | Waarom |
|---|---|---|
index.js, commands/, events/ en overige code | Ja | De bot zelf. |
package.json, package-lock.json | Ja | Op basis hiervan worden de pakketten geïnstalleerd. |
.env met het token | Ja, alleen naar de server | De bot leest het token eruit. Zet het nooit op GitHub en stuur het naar niemand (handleiding). |
node_modules/ | Nee | Duizenden bestanden. De pakketten horen op de server te worden geïnstalleerd. Pakketten met native code van Windows zouden op de server bovendien niet werken. |
.git/, logs/, testgegevens | Nee | De server heeft ze niet nodig. |
Uploaden naar je klantaccount#
- Open in je klantaccount Mijn diensten, klik op de bot en ga naar het tabblad Bestanden.
- Blijf in de hoofdmap
/. Hier hoortpackage.jsonte staan en het liefst ook het hoofdbestand van de bot. - Klik op Uploaden en selecteer de bestanden uit de hoofdmap van het project (
index.js,package.json,package-lock.json,.env…). Je kunt de bestanden ook naar het venster slepen. - Klik voor elke submap (bijvoorbeeld
commands) op Nieuwe map, open die en upload de bijbehorende bestanden erin. Hele mappen in één keer uploaden kan niet.
Een groot project met veel mappen upload je makkelijker via SFTP, de toegang regelt support voor je (contactgegevens). De limieten van het bestandsbeheer vind je in de handleiding Bestandsbeheer.
Het starten instellen#
- Ga naar het tabblad Instellingen.
- Klap Opstartcommando uit en bekijk met welk commando de bot wordt gestart. Het commando is alleen-lezen. Is het afgedekt met een gearceerde balk, dan staat de streamermodus aan. Klik bovenaan op Gegevens tonen.
- Zoek in het gedeelte Variabelen de variabele voor het hoofdbestand (aan de hand van de beschrijving, meestal met de standaardwaarde
index.js) en vul de naam van je hoofdbestand in, bijvoorbeeldindex.jsofbot.js. - Klik op Opslaan.
Wijzigingen in variabelen gaan in bij de volgende start van de bot.
Pakketten installeren#
De pakketten uit package.json moeten op de server worden geïnstalleerd.
- Controleer of het Opstartcommando
npm installbevat. - Zo ja, dan worden de pakketten vanzelf geïnstalleerd bij elke start van de bot. In de console zie je dan de uitvoer van de installatie, bijvoorbeeld
added 25 packages. De eerste start duurt daardoor langer. - Staat
npm installniet in het commando, of worden de pakketten toch niet geïnstalleerd (de bot meldtCannot find module 'discord.js'), stuur ons dan een bericht. Upload de mapnode_modulesniet vanaf je computer.
Een nieuw pakket voeg je toe door het op je computer te installeren (npm install <PAKKET>), de nieuwe package.json en package-lock.json naar de server te uploaden en de bot te herstarten.
Node.js-versie#
De Node.js-versie waarop de bot draait, lees je af uit de uitvoer. Voeg helemaal aan het begin van het hoofdbestand toe:
console.log('Node.js', process.version);Na het starten zie je in de Console bijvoorbeeld Node.js v22.….
process.version– de Node.js-versie waarop de code op dat moment draait, in de vormv<MAJOR>.<MINOR>.<PATCH>.
Wat je ermee doet:
| Bibliotheek of functie | Benodigde Node.js-versie |
|---|---|
| discord.js 14 | 18 of nieuwer |
process.loadEnvFile() (.env laden zonder pakket) | 20.12 of nieuwer |
require() van pakketten die alleen als ES-module bestaan | 20.19 of 22.12 en nieuwer |
Gebruik op je computer dezelfde hoofdversie als op de server, zodat de code zich hetzelfde gedraagt. LTS-versies worden aanbevolen (op 1 oktober 2026 is Node.js 24 de actieve LTS en Node.js 22 de LTS in de onderhoudsfase). Het veld engines in package.json verandert de versie op de server niet. Heeft de bot een andere Node.js-versie nodig, stuur ons dan een bericht.
Eerste start en controle#
Ga naar het tabblad Console en klik op Starten.
Volg de uitvoer:
Uitvoertext Node.js v22.… Ready! Logged in as MujBot#1234De regel
Ready! …komt van de bot uit de handleiding eerste bot in discord.js. Jouw bot kan een andere tekst tonen.Op Discord heeft de bot een groene stip (online).
De code bijwerken#
- Pas de code aan op je computer en test die.
- Upload de gewijzigde bestanden op het tabblad Bestanden. Bij het uploaden van een bestand met dezelfde naam wordt gevraagd of het mag worden overschreven, bevestig dat.
- Klik op het tabblad Console op Herstarten. Node.js laadt de code alleen bij het starten.
Download vóór een grotere wijziging de belangrijke bestanden naar je computer (knop Downloaden), zodat je iets hebt om naar terug te keren.
Bot met een database#
Sla gegevens die een herstart moeten overleven (punten, waarschuwingen, serverinstellingen) op in een database, niet in variabelen in het geheugen.
Maak op het tabblad Databases een database aan: Databasenaam bijvoorbeeld
bot, Toegang toegestaan vanaf%, knop Database aanmaken. Hoeveel databases je mag hebben, zie je in de regelX van Y gebruikt.Zet de gegevens in
.envop de server:.envini DB_HOST=<DATABASE_IP> DB_PORT=3306 DB_USER=<GEBRUIKER> DB_PASSWORD=<WACHTWOORD> DB_NAME=<DATABASENAAM><DATABASE_IP>en de poort staan in het veld Host (het deel voor en na de dubbele punt), de overige gegevens neem je over uit de velden Gebruiker, Wachtwoord en Databasenaam.Installeer op je computer de bibliotheek
mysql2(npm install mysql2) en maak in de code de verbinding aan:db.jsJavaScript const mysql = require('mysql2/promise'); const pool = mysql.createPool({ host: process.env.DB_HOST, port: Number(process.env.DB_PORT), user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, connectionLimit: 5, }); module.exports = pool;mysql.createPool({ … })– maakt een set verbindingen aan die steeds opnieuw worden gebruikt. Dat is robuuster dan één verbinding, die na langere inactiviteit kan wegvallen.Number(– waarden uitprocess. env. DB_ PORT) .envzijn tekst, de poort moet een getal zijn.connectionLimit: 5– hoogstens 5 gelijktijdige verbindingen. Voor een bot is dat genoeg.
Gebruik:
const db = require('./db');en daarnaconst [rijen] = await db.query('SELECT * FROM punten WHERE gebruiker = ?', [id]);. Het vraagteken is een plaatshouder: de bibliotheek voegt de waarde veilig in de query in, dat beschermt tegen SQL-injectie.
Exporteer je database regelmatig, bijvoorbeeld met het programma HeidiSQL (stappen).
De bot veilig stoppen#
Als je op Stoppen of Herstarten klikt, krijgt het proces een signaal om te stoppen. De bot kan netjes uitloggen en schrijfacties afronden:
async function ukoncit(signal) {
console.log(`${signal} ontvangen, de bot wordt gestopt…`);
await client.destroy();
process.exit(0);
}
process.on('SIGINT', ukoncit);
process.on('SIGTERM', ukoncit);process.on('SIGINT' | 'SIGTERM', …)– vangt het verzoek om te stoppen op (op je computer wordt het verstuurd door Ctrl+C, op de server door het stoppen).client.destroy()– verbreekt de verbinding van de bot met Discord.process.exit(0)– beëindigt het proces met code 0 (zonder fout).
Heb je een database, sluit die dan ook vóór process.exit (await pool.end()).
Voor gevorderden: TypeScript en andere builds#
De server voert JavaScript uit. Compileer code in TypeScript (of met een andere build) op je computer (bijvoorbeeld met npx tsc), upload de resulterende .js-bestanden naar de server (meestal de map dist) en stel bij Variabelen het hoofdbestand in op het gecompileerde bestand. De bronbestanden .ts en de ontwikkelpakketten (devDependencies) heb je op de server niet nodig.
Controle#
- In de Console staat de uitvoer van de start zonder fouten en de bot crasht niet steeds opnieuw.
- De bot is online op Discord en reageert op commando's.
- Na een klik op Herstarten is de bot binnen een paar seconden weer online.
Als iets niet werkt#
Error: Cannot find module 'discord.js'#
De pakketten zijn niet geïnstalleerd. Controleer of package.json in de hoofdmap staat en discord.js bevat onder dependencies. Volg daarna het gedeelte “Pakketten installeren”.
Error: Cannot find module '/…/index.js'#
Het hoofdbestand komt niet overeen met de instellingen: het bestand heeft een andere naam, staat in een submap, of de hoofdletters en kleine letters kloppen niet (Index.js en index.js zijn op de server twee verschillende bestanden). Corrigeer de variabele voor het hoofdbestand of verplaats het bestand naar de hoofdmap.
npm error code EJSONPARSE#
package.json is geen geldige JSON (een ontbrekende komma of een ontbrekend aanhalingsteken, een komma te veel, een opmerking). Corrigeer het bestand op je computer, controleer het met het commando npm install en upload het opnieuw.
De bot start en crasht meteen, steeds opnieuw#
De automatische herstart lost een fout in de code niet op. Zoek in de Console de eerste fout na het starten (een regel met Error en daaronder een lijst met bestanden), los die op en start de bot opnieuw. Uitleg over de meest voorkomende meldingen staat in de handleiding logs en fouten.
An invalid token was provided. of Used disallowed intents#
Een probleem met het token of met de intents in het Developer Portal. De stappen staan in de handleiding token en intents.
SyntaxError: Cannot use import statement outside a module#
De code gebruikt import, maar het project is ingesteld op require(). Stel in package.json "type": "module" in of herschrijf de code naar require(). Meer details in de handleiding logs en fouten.
Samenvatting
- Upload de code,
package.json,package-lock.jsonen.envnaar de hoofdmap op het tabblad Bestanden. Uploadnode_modulesniet. maininpackage.jsonen de variabele voor het hoofdbestand op het tabblad Instellingen moeten naar hetzelfde bestand verwijzen.- Pakketten worden op de server geïnstalleerd. Of dat automatisch gebeurt, zie je aan
npm installin het Opstartcommando. - De Node.js-versie vind je met de regel
console.. discord.js 14 heeft Node.js 18 of nieuwer nodig.log( process. version) - Herstart de bot na elke wijziging in de code.