NodeJS Express - вернуть JSON-файл с URL-адресом, который был запущен - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь написать проект NodeJS, который читает файлы JSON из каталога проекта и возвращает данные файла JSON каждый раз, когда пользователь запускает определенный URL.

Для проекта, приведенного ниже, я могу получить ответ с данными JSON при запуске http://localhost:8081/api/user в веб-браузере.

Чтобы сделать это, мне нужно явным жестким кодом функция, которая отвечает на определенный URL. Например, если я хочу добавить еще 1 JSON-файл в api folder и разрешить пользователю доступ к нему, я должен явно указать другую функцию, просто чтобы ответить на другой запрос.

app.get('/api/newJSONFile', (req, res) => {

       fs.readFile( __dirname +'/api/newJSONFile' +".json", 'utf8', function (err, data) {
           res.send(data);
           res.end( data );
       });

    });

Таким образом, после добавления кода выше пользователь сможет получить доступ к файлу JSON через http://localhost:8081/api/newJsonFile. Без явного жесткого кода Функция выше пользователь не сможет получить ответ при запуске http://localhost:8081/api/newJsonFile

Мой вопрос:

  1. Это единственный способ выполнить ответ на запрос URL? Это кажется неэффективным, как будто у меня есть 100 файлов JSON, тогда мне нужно явным жестким кодом еще 100 функций.

  2. Как правильно кодировать реализацию?

Спасибо.

Структура моего проекта:

enter image description here

server.js

const express = require('express');
const app = express();
const fs = require("fs");


app.get('/api/user', (req, res) => {

   fs.readFile( __dirname +'/api/user' +".json", 'utf8', function (err, data) {
       res.send(data);
       res.end( data );
   });

});


var server = app.listen(8081, () => {

  var host = server.address().address
  var port = server.address().port

  console.log("Example app listening at http://%s:%s", host, port)

})

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Можно ожидать имя файла в URL, а затем использовать только один обработчик маршрута для доставки файлов JSON.

app.get('/api/:jsonFile', (req, res) => {

   fs.readFile( __dirname +'/api/' + req.params.jsonFile +".json", 'utf8', function (err, data) {
       res.send(data);
       res.end( data );
   });

});

Добавьте правильную обработку ошибок, например, если файл не существует, затем отправьте обратно 404, используя что-то вроде ниже:

if (!fs.existsSync(path)) {
     res.status(404).send("");
}

Редактировать:

Чтобы вернуть симпатичный объект JSON, попробуйте использовать следующее:

res.header("Content-Type",'application/json');
res.send(JSON.stringify(YOUR_JSON_OBJECT, null, 4));
0 голосов
/ 25 апреля 2018

Вы можете использовать express статическое промежуточное программное обеспечение для обслуживания статических файлов json из указанной папки.

const express = require('express');
const app = express();

// Setup express static middleware to look for files in the api directory for all requests starting with /api
app.use('/api', express.static('api') , function(req, res){
    // Optional 404 handler
    res.status(404);
    res.json({error:{code:404}})
});


var server = app.listen(8081, () => {

   var host = server.address().address
   var port = server.address().port

   console.log("Example app listening at http://%s:%s", host, port)

})

Затем вы можете получить доступ к вашему user.json в папке /api/user.json в localhost:8081/api/user.json

EDIT:

Если вы хотите иметь возможность добавлять несколько папок, вы можете создать назначенный каталог public (вы можете называть это как угодно) и поместить туда все ваши папки верхнего уровня.

Рассмотрим следующие файлы JSON, хранящиеся во вложенном порядке:

/public/api/user.json [Одноуровневое гнездо в папке API]

/public/data/config.json [Одноуровневое гнездо в папке данных]

/public/data/server/config.json [Двухуровневое гнездо в данных -> папка сервера]

затем вы можете сделать

const express = require('express');
const app = express();

// EDIT: added options to ensure json can be accessed without extension
app.use(express.static('public',{index:false, extensions:['json']}));
app.use(function (req, res) {
    // Optional 404 handler
    res.status(404);
    res.json({
        error: {
            code: 404
        }
    });
})


var server = app.listen(8081, () => {

    var host = server.address().address
    var port = server.address().port

    console.log("Example app listening at http://%s:%s", host, port)

})

и затем получите доступ к своим файлам как:

localhost:8081/api/user.json ИЛИ localhost:8081/api/user

localhost:8081/data/config.json ИЛИ localhost:8081/data/config

localhost:8081/data/server/config.json ИЛИ localhost:8081/data/server/config

Ссылка на опции, принятые промежуточным статическим ПО Express


Дополнительное улучшение

ПРИМЕЧАНИЕ. Этот метод может случайно открыть конфиденциальные файлы конфигурации на стороне сервера [например, package.json] и, возможно, всю вашу кодовую базу. Пожалуйста, используйте этот метод осторожно и только если вы знаете, что делаете.

Если вы не хотите создавать назначенный каталог (в данном случае «публичную» папку) и помещать туда все свои папки верхнего уровня, чтобы получить к ним доступ. Вы можете использовать код ниже:

const express = require('express');
const app = express();

var publicdir = __dirname + '/';

app.use(express.static(publicdir,{extensions:['json']})); //or ,{index:false, extensions:['json']}
app.use(function (req, res) {

    res.status(404);
    res.json({
        error: {
            code: 404
        }
    });
})


var server = app.listen(8081, () => {

    var host = server.address().address
    var port = server.address().port

    console.log("Example app listening at http://%s:%s", host, port)

})
0 голосов
/ 25 апреля 2018

Express поддерживает параметры вашего маршрута .

Таким образом, получить произвольную строку из URL так же просто, как изменить маршрут на:

app.get('/api/:file', (req, res) => {

    fs.readFile( __dirname +'/api/' + req.params.file + ".json", 'utf8', function (err, data) {
        res.send(data);
        res.end( data );
    });

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...