我有一个电影查找应用程序,它在后端进行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');
});
答案 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
的内容将不会自动更新。