1229 Stimmen

Wie kann ich in Node.js Funktionen aus anderen Dateien "einbinden"?

Nehmen wir an, ich habe eine Datei namens app.js. Ziemlich einfach:

var express = require('express');
var app = express.createServer();
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.get('/', function(req, res){
  res.render('index', {locals: {
    title: 'NowJS + Express Example'
  }});
});

app.listen(8080);

Was ist, wenn ich eine Funktion in "tools.js" habe. Wie würde ich sie importieren, um sie in apps.js zu verwenden?

Oder...soll ich aus "tools" ein Modul machen und es dann voraussetzen? << Scheint schwer zu sein, ich mache lieber den einfachen Import der tools.js Datei.

14voto

Fernando Punkte 149

Udo G. sagte:

  • Die Funktion eval() kann nicht innerhalb einer Funktion verwendet werden und muss innerhalb von dem globalen Bereich aufgerufen werden, da sonst keine Funktionen oder Variablen zugänglich (d.h. man kann keine include() Utility Funktion oder oder ähnliches).

Er hat recht, aber es gibt eine Möglichkeit, den globalen Bereich von einer Funktion aus zu beeinflussen. Verbessern Sie sein Beispiel:

function include(file_) {
    with (global) {
        eval(fs.readFileSync(file_) + '');
    };
};

include('somefile_with_some_declarations.js');

// the declarations are now accessible here.

Ich hoffe, das hilft.

13voto

M.Hefny Punkte 2474

Es funktionierte bei mir wie folgt....

Lib1.js

//Any other private code here 

// Code you want to export
exports.function1 = function(params) {.......};
exports.function2 = function(params) {.......};

// Again any private code

jetzt im Main.js Datei müssen Sie Folgendes einfügen Lib1.js

var mylib = requires('lib1.js');
mylib.function1(params);
mylib.function2(params);

Bitte denken Sie daran, die Lib1.js in Ordner node_modules .

12voto

Ashish Duklan Punkte 135

app.js

let { func_name } = require('path_to_tools.js');
func_name();    //function calling

tools.js

let func_name = function() {
    ...
    //function body
    ...
};

module.exports = { func_name };

12voto

Ein anderer Weg, dies zu tun, ist meiner Meinung nach, alles in der Lib-Datei auszuführen, wenn Sie verlangen() Funktion über (function(/* things here */){})(); Dadurch erhalten all diese Funktionen einen globalen Geltungsbereich, genau wie die eval() Lösung

src/lib.js

(function () {
    funcOne = function() {
            console.log('mlt funcOne here');
    }

    funcThree = function(firstName) {
            console.log(firstName, 'calls funcThree here');
    }

    name = "Mulatinho";
    myobject = {
            title: 'Node.JS is cool',
            funcFour: function() {
                    return console.log('internal funcFour() called here');
            }
    }
})();

Und dann können Sie in Ihrem Hauptcode Ihre Funktionen mit Namen aufrufen, wie z.B.:

main.js

require('./src/lib')
funcOne();
funcThree('Alex');
console.log(name);
console.log(myobject);
console.log(myobject.funcFour());

Wird diese Ausgabe machen

bash-3.2$ node -v
v7.2.1
bash-3.2$ node main.js 
mlt funcOne here
Alex calls funcThree here
Mulatinho
{ title: 'Node.JS is cool', funcFour: [Function: funcFour] }
internal funcFour() called here
undefined

Achten Sie auf die undefiniert wenn Sie meine object.funcFour() wird es dasselbe sein, wenn Sie mit eval() . Hoffentlich hilft es :)

10voto

Kristianmitk Punkte 4160

Ich möchte nur hinzufügen, falls Sie nur bestimmte Funktionen benötigen, die aus Ihrem tools.js dann können Sie mit einem Destruktionsauftrag die in node.js seit der Version 6.4 - siehe node.green .


Beispiel : (beide Dateien befinden sich in demselben Ordner)

tools.js

module.exports = {
    sum: function(a,b) {
        return a + b;
    },
    isEven: function(a) {
        return a % 2 == 0;
    }
};

main.js

const { isEven } = require('./tools.js');

console.log(isEven(10));

Ausgabe: true


Dadurch wird auch vermieden, dass Sie diese Funktionen als Eigenschaften eines anderen Objekts zuweisen, wie es in der folgenden (allgemeinen) Zuweisung der Fall ist:

const tools = require('./tools.js');

wo Sie anrufen müssen tools.isEven(10) .


HINWEIS:

Vergessen Sie nicht, dem Dateinamen den korrekten Pfad voranzustellen - selbst wenn sich beide Dateien im selben Ordner befinden, müssen Sie das Präfix ./

Von Node.js-Dokumente :

Ohne ein führendes '/', './' oder '../' zur Kennzeichnung einer Datei, muss das Modul entweder ein Kernmodul sein oder aus einem node_modules-Ordner geladen sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X