在Express应用初始化期间加载JSON文件

时间:2016-08-09 05:24:25

标签: javascript json node.js express backend

我有一个电影查找应用程序,它在后端进行API调用。在初始化期间,我需要加载一些JSON文件:一个(lang.json)包含用于搜索目的的语言列表,另一个(存储在config变量中)用于获取电影海报的链接

如何确保在发出HTTP请求之前完成这些文件的加载?我能想到的一个解决方案是将调用放到app.get()app.listen()内部fs.readfile()的回调。但有更好的方法吗? Web开发对我来说是全新的。

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');
});

1 个答案:

答案 0 :(得分: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.json的内容在磁盘上发生更改,lang的内容将不会自动更新。