2016-08-09 2 views
0

У меня есть приложение для поиска фильмов, которое вызывает вызовы API в бэкэнд. Во время инициализации мне нужно загрузить некоторые файлы JSON: один (lang.json) содержит список языков для поиска, другой (хранится в переменной config) используется для получения ссылки на плакат фильма.Загрузка файлов JSON во время запуска Express-приложения

Как я могу гарантировать, что загрузка этих файлов будет завершена до того, как будет сделан запрос HTTP? Одним из решений, о котором я могу думать, является включение вызовов app.get() и app.listen() внутри обратного вызова fs.readfile(). Но есть ли лучший способ? Веб-разработка для меня совершенно новая.

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

Почему вы не загружаете файл вне функции 'app.get'? – Roysh

ответ

1

Самый простой способ это просто использовать fs.readFileSync() до вашего звонка в app.listen(). Например:

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

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

// ... 

Просто надо знать, что содержимое lang не будет автоматически обновляться, если изменить содержимое lang.json на диске в течение всего срока службы процесса вашего узла.

+0

Какова эффективность использования метода синхронной загрузки? Мое приложение уже значительно замедлилось с тех пор, как я переместил вызовы API с клиента на сервер. – GreatHam

+0

Ошибка производительности не имеет значения, поскольку она будет выполняться только один раз при запуске, * до того, как вы начнете слушать запросы. Что касается производительности ваших внешних запросов, если это сайт, который медленно реагирует (из-за ограничения скорости, условий сети и т. Д.), Вы можете рассмотреть кеширование (некоторые) результатов ваших внешних запросов API (либо на весь срок службы процесс или после некоторой продолжительности). Таким образом, запросы для одних и тех же данных не потребуют от вас доступа к сети. – mscdex

Смежные вопросы