2016-08-09 7 views
0

Ich habe eine App zur Filmsuche, die API-Aufrufe im Backend durchführt. Während der Initialisierung muss ich einige JSON-Dateien laden: eine (lang.json) enthält eine Liste von Sprachen für Suchzwecke, die andere (gespeichert in der config Variable) wird verwendet, um einen Link zum Filmplakat zu bekommen.Laden von JSON-Dateien während der Express-App-Initialisierung

Wie würde ich sicherstellen, dass das Laden dieser Dateien abgeschlossen ist, bevor eine HTTP-Anfrage gestellt wird? Eine Lösung, die ich mir vorstellen kann, beinhaltet die Aufrufe app.get() und app.listen() innerhalb fs.readfile() Rückruf. Aber gibt es einen besseren Weg? Web-Entwicklung ist für mich völlig neu.

var express = require('express'); 
var app = express(); 
var fs = require('fs'); 
var request = require('request'); 
var merge = require('merge'); 

require('dotenv').config(); 

var apiKey = process.env.API_KEY; 
var config = {}; 

app.use(express.static('view')); 

// TODO load config and lang before below code 

app.get('/lang', function(req, res) { 
    fs.readFile('lang.json', function(err, data) { 
     if (err) throw err; 
     res.json(JSON.parse(data)); 
    }); 
}); 

app.get('/genres', function(req, res) { 
    request.get({ 
     url: 'http://api.themoviedb.org/3/genre/movie/list', 
     qs: {api_key: apiKey} 
    }, function(error, response, body) { 
     res.json(JSON.parse(body).genres); 
    }); 
}); 

app.get('/randomMovie', function(req, res) { 
    request.get({ 
     url: 'https://api.themoviedb.org/3/discover/movie', 
     qs: merge(req.query, {api_key: apiKey}) 
    }, function(error, response, body) { 
     body = JSON.parse(body).results; 
     var len = body.length; 
     var i = Math.floor(Math.random() * len); 
     var movie = body[i]; 
     // movie.poster_path = movie.images.base_url + movie.images.poster_sizes[6] + movie.poster_path; 
     res.json(movie); 
    }); 
}); 

app.listen(3000, function() { 
    console.log('server started on port 3000'); 
}); 
+0

Warum laden Sie die Datei nicht außerhalb der Funktion 'app.get'? – Roysh

Antwort

1

Der einfachste Weg ist nur zu app.listen()fs.readFileSync() vor Ihrem Anruf zu nutzen. Zum Beispiel:

var lang = fs.readFileSync('lang.json'); 

app.get('/lang', function(req, res) { 
    res.setHeader('Content-Type', 'application/json'); 
    res.send(lang); 
}); 

// ... 

Seien Sie sich bewusst sein, dass der Inhalt von lang nicht automatisch, wenn der Inhalt von lang.json Änderung während der Lebensdauer des Knotens Prozesses auf der Festplatte aktualisieren.

+0

Wie wird die Leistung durch die Verwendung einer synchronen Lademethode beeinflusst? Meine App hat sich bereits erheblich verlangsamt, seit ich die API-Aufrufe vom Client auf die Serverseite verschoben habe. – GreatHam

+0

Der Leistungshit ist irrelevant, da er beim Start nur einmal ausgeführt wurde, * bevor * Sie auf Anfragen reagieren. Was die Leistung Ihrer externen Anfragen angeht, sollten Sie, wenn es sich um die Website handelt, die langsam reagiert (aufgrund von Ratenbegrenzung, Netzwerkbedingungen usw.), die Zwischenspeicherung (einiger) Ergebnisse Ihrer externen API-Anfragen erwägen (entweder für die Lebensdauer der Prozess oder nach einiger Zeit). Auf diese Weise müssen Sie bei Abfragen für dieselben Daten nicht so oft über das Netzwerk gehen. – mscdex

Verwandte Themen