Проблема в том, что ресурс, вероятно, не может быть загружен из-за того, что веб-приложение не обслуживает его ...
Это можно доказать, попытавшись получить доступ к URL-адресу файла json.
Тогда все зависит от того, как вы хотите служить JSON
:
Filesystem
· Serve Static : /public/file.json
В этом примере у вас будут файлы в общедоступной папке, и они будут служить статическим содержимым файловой системы.
app.use(express.static('public'))
Сделайте папку с именем public и сохраните jsons внутри, они будут доступны в корне веб-приложения localhost:3000/nuts0.json
Подробнее об обслуживании статических файлов в экспрессе
· Send File : /private/file.json
В этом примере у вас все еще есть JSON в виде файла в файловой системе, но не в общедоступной (общедоступной) папке (как в примере выше).
Вместо этого здесь вы используете его в качестве ресурса в пути к маршрутизатору (запрос GET), и вы можете даже применить предварительные проверки (если запрос требует файлы cookie, параметры, ...)
app.get("/jsonFiles/nut0.json",(req,res)=>{
res.sendFile(__dirname+"/private/nuts0.json")
})
Динамически генерируется по запросу 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» не должен существовать, то есть путь к маршрутизатору веб-приложения в конце, то, что обслуживается, это то, что находится в 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
Подробнее о req.params (Express API Doc)
Лично, в основном для производства, я бы использовал NGINX в качестве обратного прокси для ваших приложений node.js и вместо этого передавал статический контент.