2017-10-03 2 views
0

J'ai un nœud app express avec un simple html, app.js, helper.jsComment exposer les fonctions dans l'application Noeud

commande Exécution node app.js fonctionne très bien et la page apparaît et fonctionne correctement à localhost: 3000.

Je veux être capable d'appeler des fonctions qui existent dans app.js, appelées FROM helper.js. J'ai vu plusieurs exemples dans StackO à propos de l'utilisation de module.exports mais les exemples appellent toutes les fonctions dans l'autre sens.

Existe-t-il un moyen de le faire? J'ai vu un peu de browserify qui semble prometteur. Est-ce la seule option?

Je sais que la façon dont cela est écrit ne fonctionnera pas, mais pourrait-on faire quelque chose comme ça? Tellement que si j'ai cliqué sur un bouton dans la page Web il console '3.14'?

app.js

// Various lines of node and express code 
module.exports = {iLikePi: function() { return '3.14' } } 

helper.js

var app_mod = require('./app.js') 
function aButtonClicked() { console.log(app_mod.iLikePi()) } 

index.html

// A button onclick event that calls aButtonClicked() 

Et enfin, la raison de tout cela. J'essaie d'utiliser sqlite3 dans une application de noeud. La seule façon dont je peux exiger sqlite3 dans un module semble être dans l'app.js. Cela ne fonctionne pas lorsque j'essaie d'utiliser sqlite3 dans helper.js. S'il y avait un moyen d'écrire un module en dehors de app.js qui peut appeler et utiliser sqlite3 du npm, alors ce serait une alternative qui serait très bien pour moi!

Merci à tous, Frank

+0

Il est toujours "juste JS", alors faites votre aide une vraie classe, pas un objet plat, et passer ensuite votre assistant l'application dans son constructeur afin qu'il puisse être lié à 'this.app'. Ensuite, chaque fonction de votre assistant aura accès à l'application et à toute fonction qu'elle possède. –

Répondre

0

Vous pouvez certainement appeler des fonctions d'un autre fichier!

Voici un exemple:

app.js

const iLikePie =() => 3.14 

module.exports = iLikePie 

helper.js

const app_mod = require('./app.js) 

const aButtonClicked =() => console.log(app_mod()) 

Ce imprimera 3,14 quand aButtonClicked est appelé.

+0

Salut Alex. Merci d'avoir répondu. J'ai essayé votre suggestion et le navigateur a consolé cette erreur: ReferenceError: require n'est pas défini – FrankLeeKant

+0

UG.Voici mon commentaire complet: Salut Alex. Merci d'avoir répondu. J'ai essayé votre suggestion et le navigateur a consolé cette erreur: 'ReferenceError: require n'est pas défini (helper.js line 1)' Ensuite, probablement parce que le helper.js n'a jamais pu 'exiger' l'app.js, il then error-ed ceci quand unButtonClicked a été appelé: 'ReferenceError: impossible d'accéder à la déclaration lexicale' vanilla 'avant l'initialisation' Cette erreur 'require is not defined' est ce que je recevais avant et m'a fait penser que je ne pouvais pas' t 'require' un module qui était l'application de nœud réelle. Merci encore. – FrankLeeKant

0

Votre code côté client ne doit jamais accéder directement au serveur SQL. Vous pouvez exposer vos données via un appel d'API/une requête HTTP ou vers une certaine route.

Un exemple POST-côté client:

onButtonClick =() => { 
    fetch("/math/executepifunc", { 
    method: "POST", 
    redirect: "follow", 
    headers: { 
     "Accept": "application/json", 
     "Content-Type": "application/json" 
    }, 
    body: JSON.stringify({ 
     num: <value> // something your want server to do with the Pi 
    }) 
}).then(response => { 
    // Process your response there 
}).catch(err => {throw err;}); 
} 

De serveur:

// Mini-middleware grabs all routes under "/math" 
var mathFuncRouter = express.Router(); 
router.post("/executepifunc", (req, res) => { 
    const num = req.body.num; 
    // execute your function from server 
}); 

// Connect to your custom middleware 
app.use("/math", mathFuncRouter);