Node.js:使用 express 加载 JSON 文件时出现路径错误
Node.js : Path error loading JSON file using express
我有一组这样制作的文件夹和文件:
viz
|_ app.js // node application
|_ public
|_ css
|_ bubblemap.css
|_ images
|_ nuts
|_ nuts0.json
|_ script
|_ bubblemap.js
|_ views
|_ bubblemap.hbs
bubblemap.hbs:
<html lang='en'>
<head>
<meta charset='utf-8'>
<title>Bubblemap</title>
<script src='https://d3js.org/d3.v5.js' charset='utf-8'></script>
<link href='/css/bubblemap.css' rel='stylesheet'/>
</head>
<body>
</body>
<script>
var viewData = {};
viewData.dataHome = JSON.parse('{{json dataHome }}'.replace(/"/g, '"').replace(/</, ''));
viewData.dataWork = JSON.parse('{{json dataWork}}'.replace(/"/g, '"').replace(/</, ''));
</script>
<script src='/script/bubblemap.js' rel='script'/><{{!}}/script>
</html>
bubblemap.js:
(function() {
var files = ['../nuts/nuts0.json', '../nuts/nuts2.json'];
var promises = [];
promises.push(d3.json(files[0]));
promises.push(d3.json(files[1]));
Promise.all(promises)
.then(makeBubblemap)
.catch(function(err) {
console.log('Error loading files!');
throw err;
});
function makeBubblemap(data) {
var nuts0 = data[0];
var nuts2 = data[1];
var home = viewData.dataHome;
var work = viewData.dataWork;
}
)
这是节点应用程序文件。
viz/app.js:
// import...
var app = express();
const webapp_options = {'port': 3000};
initialize();
async function initialize() {
await postgreSQLlib.connect();
app.set('views', '' + __dirname + '/views');
app.use(express.static(__dirname + '/public'));
app.set('view engine', 'hbs');
app.engine('hbs', hbs.__express);
hbs.registerHelper('json', function(context) {
return JSON.stringify(context);
});
app.get('/bubblemap', bubblemap);
app.listen(webapp_options.port, function() {
console.log('Ready & listening on http://localhost:' + webapp_options.port + '/');
});
}
async function bubblemap(req, res) {
// download data from db
var dataWork = await postgreSQLlib.getTableHome();
var dataHome = await postgreSQLlib.getTableWork();
// create and fill object to pass to view
var viewData = {};
viewData.dataWork = dataWork;
viewData.dataHome = dataHome;
// pass data to view
res.render('bubblemap', viewData);
}
我收到这个错误:
Error loading files!
Error: 404 Not Found
也就是nuts0和nuts2文件没有被正确拾取。
我认为这是一个路径问题,但对我来说似乎是正确的。
我尝试了:../nuts/nuts0.json
、./nuts/nuts0.json
、nuts/nuts0.json
但没有任何效果。
这里的问题是资源可能无法加载,因为 webapp 没有提供它...
这可以通过尝试访问 json 文件的 url 来证明。
然后这取决于你想如何服务 JSON
:
文件系统
·Serve Static : /public/file.json
在此示例中,文件位于 public 可访问文件夹中,它们将作为文件系统中的静态内容提供。
app.use(express.static('public'))
创建一个名为 public 的文件夹并将 json 存储在其中,它们将可以在 webapp 的根目录下访问 localhost:3000/nuts0.json
Learn more on serving static files in express
·Send File : /private/file.json
在此示例中,文件系统中仍然有一个 JSON 作为文件,但不在可通过 Web 访问的 (public) 文件夹中(如上例)。
相反,您在这里将其作为路由器路径(GET 请求)中的资源提供服务,您甚至可以应用预服务检查(如果请求需要 cookie、参数...)
app.get("/jsonFiles/nut0.json",(req,res)=>{
res.sendFile(__dirname+"/private/nuts0.json")
})
More on express : sendFile
根据 GET 请求动态生成
在此示例中,您的文件系统中没有文件,但您根据请求(来自数据库、内存...)实时构建它
您还可以对此应用预服务检查(用户是否具有所需的权限、cookie、请求参数等。)
global.example_counter = 0; //in memory (global) variable
app.get("/jsonFiles/a-virtual-path-for-the-json",(req,res)=>{
example_request_counter++
res.json({"total requests":example_request_counter})
})
"jsonFiles" 不需要存在,那是 webapp 路由器最后的路径,所服务的是 res.send / res.json
中的内容
global.inMemoryDB = { //in memory (global) variable
"nuts0":{"data":"the universe is in fact a multiverse"},
"nuts1":{"data":"tesla was bright"},
"nuts2":{"data":"sugar kills..."},
};
//router path
app.get("/jsonFiles/:j",(req,res)=>{
if(inMemoryDB[req.params.j]){res.json(inMemoryDB[req.params.j])}
else{res.json({"error":"non-existing virtual file requested"}
)}
// http://localhost:3000/jsonFiles/nuts0 will serve you the inMemory json
Learn more on req.params (Express API Doc)
就个人而言,主要用于生产,我会使用 NGINX 作为您的 node.js 应用程序的反向代理,并用它来提供静态内容。
我有一组这样制作的文件夹和文件:
viz
|_ app.js // node application
|_ public
|_ css
|_ bubblemap.css
|_ images
|_ nuts
|_ nuts0.json
|_ script
|_ bubblemap.js
|_ views
|_ bubblemap.hbs
bubblemap.hbs:
<html lang='en'>
<head>
<meta charset='utf-8'>
<title>Bubblemap</title>
<script src='https://d3js.org/d3.v5.js' charset='utf-8'></script>
<link href='/css/bubblemap.css' rel='stylesheet'/>
</head>
<body>
</body>
<script>
var viewData = {};
viewData.dataHome = JSON.parse('{{json dataHome }}'.replace(/"/g, '"').replace(/</, ''));
viewData.dataWork = JSON.parse('{{json dataWork}}'.replace(/"/g, '"').replace(/</, ''));
</script>
<script src='/script/bubblemap.js' rel='script'/><{{!}}/script>
</html>
bubblemap.js:
(function() {
var files = ['../nuts/nuts0.json', '../nuts/nuts2.json'];
var promises = [];
promises.push(d3.json(files[0]));
promises.push(d3.json(files[1]));
Promise.all(promises)
.then(makeBubblemap)
.catch(function(err) {
console.log('Error loading files!');
throw err;
});
function makeBubblemap(data) {
var nuts0 = data[0];
var nuts2 = data[1];
var home = viewData.dataHome;
var work = viewData.dataWork;
}
)
这是节点应用程序文件。
viz/app.js:
// import...
var app = express();
const webapp_options = {'port': 3000};
initialize();
async function initialize() {
await postgreSQLlib.connect();
app.set('views', '' + __dirname + '/views');
app.use(express.static(__dirname + '/public'));
app.set('view engine', 'hbs');
app.engine('hbs', hbs.__express);
hbs.registerHelper('json', function(context) {
return JSON.stringify(context);
});
app.get('/bubblemap', bubblemap);
app.listen(webapp_options.port, function() {
console.log('Ready & listening on http://localhost:' + webapp_options.port + '/');
});
}
async function bubblemap(req, res) {
// download data from db
var dataWork = await postgreSQLlib.getTableHome();
var dataHome = await postgreSQLlib.getTableWork();
// create and fill object to pass to view
var viewData = {};
viewData.dataWork = dataWork;
viewData.dataHome = dataHome;
// pass data to view
res.render('bubblemap', viewData);
}
我收到这个错误:
Error loading files! Error: 404 Not Found
也就是nuts0和nuts2文件没有被正确拾取。 我认为这是一个路径问题,但对我来说似乎是正确的。
我尝试了:../nuts/nuts0.json
、./nuts/nuts0.json
、nuts/nuts0.json
但没有任何效果。
这里的问题是资源可能无法加载,因为 webapp 没有提供它... 这可以通过尝试访问 json 文件的 url 来证明。
然后这取决于你想如何服务 JSON
:
文件系统
·Serve Static : /public/file.json
在此示例中,文件位于 public 可访问文件夹中,它们将作为文件系统中的静态内容提供。
app.use(express.static('public'))
创建一个名为 public 的文件夹并将 json 存储在其中,它们将可以在 webapp 的根目录下访问 localhost:3000/nuts0.json
Learn more on serving static files in express
·Send File : /private/file.json
在此示例中,文件系统中仍然有一个 JSON 作为文件,但不在可通过 Web 访问的 (public) 文件夹中(如上例)。 相反,您在这里将其作为路由器路径(GET 请求)中的资源提供服务,您甚至可以应用预服务检查(如果请求需要 cookie、参数...)
app.get("/jsonFiles/nut0.json",(req,res)=>{
res.sendFile(__dirname+"/private/nuts0.json")
})
More on express : sendFile
根据 GET 请求动态生成
在此示例中,您的文件系统中没有文件,但您根据请求(来自数据库、内存...)实时构建它 您还可以对此应用预服务检查(用户是否具有所需的权限、cookie、请求参数等。)
global.example_counter = 0; //in memory (global) variable
app.get("/jsonFiles/a-virtual-path-for-the-json",(req,res)=>{
example_request_counter++
res.json({"total requests":example_request_counter})
})
"jsonFiles" 不需要存在,那是 webapp 路由器最后的路径,所服务的是 res.send / res.json
global.inMemoryDB = { //in memory (global) variable
"nuts0":{"data":"the universe is in fact a multiverse"},
"nuts1":{"data":"tesla was bright"},
"nuts2":{"data":"sugar kills..."},
};
//router path
app.get("/jsonFiles/:j",(req,res)=>{
if(inMemoryDB[req.params.j]){res.json(inMemoryDB[req.params.j])}
else{res.json({"error":"non-existing virtual file requested"}
)}
// http://localhost:3000/jsonFiles/nuts0 will serve you the inMemory json
Learn more on req.params (Express API Doc)
就个人而言,主要用于生产,我会使用 NGINX 作为您的 node.js 应用程序的反向代理,并用它来提供静态内容。