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.

39voto

Placeholder Punkte 4239

Hier ist eine einfache und verständliche Erklärung:

Server.js Inhalt:

// Include the public functions from 'helpers.js'
var helpers = require('./helpers');

// Let's assume this is the data which comes from the database or somewhere else
var databaseName = 'Walter';
var databaseSurname = 'Heisenberg';

// Use the function from 'helpers.js' in the main file, which is server.js
var fullname = helpers.concatenateNames(databaseName, databaseSurname);

Helpers.js Inhalt:

// 'module.exports' is a node.JS specific feature, it does not work with regular JavaScript
module.exports = 
{
  // This is the function which will be called in the main file, which is server.js
  // The parameters 'name' and 'surname' will be provided inside the function
  // when the function is called in the main file.
  // Example: concatenameNames('John,'Doe');
  concatenateNames: function (name, surname) 
  {
     var wholeName = name + " " + surname;

     return wholeName;
  },

  sampleFunctionTwo: function () 
  {

  }
};

// Private variables and functions which will not be accessible outside this file
var privateFunction = function () 
{
};

37voto

jmparatte Punkte 387

Ich war auch auf der Suche nach einer NodeJS 'include' Funktion und habe mir die Lösung von Udo G. - siehe Meldung https://stackoverflow.com/a/8744519/2979590 . Sein Code funktioniert nicht mit meinen eingebundenen JS-Dateien. Schließlich habe ich das Problem auf diese Weise gelöst:

var fs = require("fs");

function read(f) {
  return fs.readFileSync(f).toString();
}
function include(f) {
  eval.apply(global, [read(f)]);
}

include('somefile_with_some_declarations.js');

Sicher, das hilft.

30voto

Ingo Punkte 5017

Erstellen Sie zwei JavaScript-Dateien. z.B. import_functions.js y main.js

1.) import_functions.js

// Declaration --------------------------------------

 module.exports =
   {
     add,
     subtract
     // ...
   }

// Implementation ----------------------------------

 function add(x, y)
 {
   return x + y;
 }

 function subtract(x, y)
 {
   return x - y;
 }

// ...

2.) main.js

// include ---------------------------------------

const sf= require("./import_functions.js")

// use -------------------------------------------

var x = sf.add(4,2);
console.log(x);

var y = sf.subtract(4,2);
console.log(y);

Ausgabe

6
2

25voto

Dharmesh Punkte 1838

Sagen wir, wir wollen die Funktion ping() y add(30,20) die sich in lib.js Datei von main.js

main.js

lib = require("./lib.js")

output = lib.ping();
console.log(output);

//Passing Parameters
console.log("Sum of A and B = " + lib.add(20,30))

lib.js

this.ping=function ()
{
    return  "Ping Success"
}

//Functions with parameters
this.add=function(a,b)
    {
        return a+b
    }

25voto

Chad Austin Punkte 402

Das vm-Modul in Node.js bietet die Möglichkeit, JavaScript-Code im aktuellen Kontext (einschließlich globalem Objekt) auszuführen. Siehe http://nodejs.org/docs/latest/api/vm.html#vm_vm_runinthiscontext_code_filename

Beachten Sie, dass es seit heute einen Fehler im vm-Modul gibt, der runInThisContext daran hindert, das Richtige zu tun, wenn es aus einem neuen Kontext aufgerufen wird. Dies ist nur von Bedeutung, wenn Ihr Hauptprogramm Code in einem neuen Kontext ausführt und dieser Code dann runInThisContext aufruft. Siehe https://github.com/joyent/node/issues/898

Leider funktioniert der von Fernando vorgeschlagene with(global) Ansatz nicht für benannte Funktionen wie "function foo() {}"

Kurz gesagt, hier ist eine include()-Funktion, die für mich funktioniert:

function include(path) {
    var code = fs.readFileSync(path, 'utf-8');
    vm.runInThisContext(code, path);
}

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