In un tipico server apache questo metodo funzionerebbe, perché i file vengono referenziati in base alla loro posizione nella cartella. In express, però, non è così semplice. Le richieste vengono passate attraverso il sistema di routing, e non solo quelle delle pagine, ma anche quelle delle immagini e degli script. Per questo motivo
nella loro documentazione indicano di inserire gli script che devono essere resi disponibili al browser nella cartella "public" e impostarla come hai fatto nel tuo codice in questa riga:
app.use(express.static(path.join(__dirname, 'public')));
Per chi si affaccia per le prime volte a questo sistema la cosa potrebbe sembrare innaturale, ma è così
Comunque, da quello che mi hai scritto mi è venuto il dubbio che forse non hai chiaro cosa sta succedendo nel tuo codice. I file .ejs sono un tipo di file che generalmente va utilizzato dal server per preparare ciò che viene poi inviato al browser dell'utente. I browser non hanno il supporto per i file .ejs incluso.
Nell'ultima sezione del codice (dove dici che ti crea l'errore) tu stai indicando al browser l'esistenza di un file chiamato "callback.js" (oltretutto, non "callback.ejs"). Il browser appena esamina il codice HTML farà una richiesta al server per ricevere questo file, ma il server non sa cosa rispondergli.
La domanda che dovresti farti è:
Il file callback.js va eseguito dal browser dell'utente o dal mio server tramite node?
Nel primo caso, allora risolveresti spostando il file nella cartella public e assicurandoti che non sia un file EJS, ma un semplice file JS.
Nel secondo caso, dovresti creare una route per quel file, ma probabilmente ha poco senso che il browser lo richiami in un tag "script"...
Dalle informazioni che hai dato questo è il massimo che ti posso dire, spero possa esserti utile, scrivi comunque se hai ancora domande su come funziona