Чтение динамических данных JSON в Node JS - PullRequest
0 голосов
/ 12 июня 2018

У меня есть экспресс-сервер.

server.js

const express = require('express');
const app = express();
var json = require("./sample.js")
app.use("/", (req, res)=>{
  console.log("----------->", JSON.stringify(json));
  res.status(200).send(JSON.stringify(json));
});

app.listen(2222,()=>{
  console.log(`Listening on port localhost:2222/ !`);
});

sample.js

var offer = {
"sample" : "Text",
"ting" : "Toing"
}

module.exports = offer ;

Как только я выполняю файл server.js, он выбираетданные json из файла sample.js.Если я обновляю данные sample.js, пока server.js все еще выполняется, я не получаю обновленные данные.Есть ли способ сделать то же самое, не останавливая выполнение server.js.

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Синхронизация:

var json = require('sample.js');
var obj = JSON.parse(json.readFileSync('file', 'utf8'));

Асинхронизация:

var json = require('sample.js');
var obj;
json.readFile('file', 'utf8', function (err, data) {
  if (err) throw err;
  obj = JSON.parse(data);
});
0 голосов
/ 12 июня 2018

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

Причина, по которой require не делаетДело в том, что NodeJS автоматически кеширует модули для вас.Таким образом, даже если вам потребуется это в обработчике запросов (в use), оно не будет работать.

Поскольку вы не можете использовать require, это не будет удобно (или эффективно) дляиспользовать модуль.Поэтому ваш файл должен быть в формате JSON:

{
   "sample" : "Text",
   "ting" : "Toing"
}

Чтобы прочитать его, вы должны использовать модуль fs (файловая система).Это позволяет вам каждый раз читать файл с диска:

const fs = require('fs');
app.get("/", (req, res) => {
  // To read as a text file, you have to specify the correct 
  // encoding.
  fs.readFile('./sample.json', 'utf8', (err, data) => {  
    // You should always specify the content type header,
    // when you don't use 'res.json' for sending JSON.  
    res.set('Content-Type', 'application/json');
    res.send(data)
  })
});

Важно знать, что теперь data является строкой, а не объектом.Вам понадобится JSON.parse(), чтобы получить объект.

Также use в этом случае не рекомендуется.Это для промежуточного программного обеспечения, вы должны рассмотреть возможность использования get (как в моем примере) или all, если вы хотите обрабатывать любой глагол.

0 голосов
/ 12 июня 2018

Вам нужно прочитать файл во время выполнения:

fs = require('fs');

function getJson() {
  fs.readFile('sample.json', (err, jsonData) => {
    if (err) {
      console.log('error reading sample.js ', err)
    }
    return(jsonData)
  }
}

}

убедитесь, что ваш sample.js вместо этого является просто объектом json.

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