Как вывести данные из файла на экран? - PullRequest
0 голосов
/ 12 ноября 2018

Когда я иду по маршруту '/ gallery', я получаю данные из файла posts.json. Используя модуль 'fs' и метод read(), я читаю данные из файла и записываю их в массив this.pictures. Но когда я перехожу к маршруту / gallery, загружается новый файл данных с именем gallery.

Мне нужно прочитать данные из файла и отобразить их на экране, а не загружать новый файл :) Пожалуйста, помогите решить эту проблему

app.js:

const express = require('express');
const  Database =  require('./db');

const app = express();
const port = 3000;
const  db = new Database();

app.use(express.json());

app.get('/gallery', (req, res) => {
    db.read();
    res.send(db.pictures);
});

app.listen(port, () => {
    console.log(`Example app listening on port ${port}!`);
});

db.js:

class Database {

    constructor(){
        this.fs = require('fs');
        this.pictures = [];

    }

    read() {
        this.fs.readFile('./posts.json', (err, data)=> {
            if(err) {
                throw err;
            }else {
               this.pictures = data;
            }
        });
    }
}

module.exports = Database;

1 Ответ

0 голосов
/ 12 ноября 2018

Есть пара вещей, которые я вижу, которые не соответствуют вашему коду. Вы вызываете асинхронный метод в своем конструкторе, чего не следует делать. Вы планируете вызывать read () только один раз или очень часто? Я хотел бы взглянуть на конструкторы NodeJS, а также освежить в асинхронных практиках. Сказав это, вот способ, которым я мог бы настроить код, который у вас есть

App.js

const express = require('express');
const  Database =  require('./db');

const app = express();
const port = 3000;
const  db = new Database();

app.use(express.json());

app.get('/gallery', (req, res) => {
    // Just call pictures. This will call read everytime it needs pictures - This may not work if you only need to call it once per app life   
     db.pictures(function(err,data){
        if(err){
           throw(err)
        }else{
           res.send(data)
         }
});

app.listen(port, () => {
    console.log(`Example app listening on port ${port}!`);
});

db.js - это где ваше приложение нуждается в дополнительной работе

const fs = require('fs')
class Database {
  pictures (callback) {
    return this.read(callback)
  }
  //Read the file from the server. Make sure to specify utf-8 to read as a string basically
  read (callback) {
    return fs.readFile('./posts.json', 'utf-8', (err, data) => {
       if (err) {
          throw err
       } else {
          callback(null,data)
       }
    }) 
  }
}

module.exports = Database
Если вы планируете вызывать read () только один раз и только в начале приложения, возможно вызвать readFileSync, который является синхронной версией файла, который вы вызвали. Поскольку Node блокирует , вы не хотите делать это в середине приложения, но это опция чтения конфигурационных файлов и т. Д. При запуске приложения.

Еще один способ использования обещаний:

const express = require('express')
const Database = require('./db')

const app = express()
const port = 3000
const db = new Database()

app.use(express.json())

app.get('/gallery', (req, res) => {
  db.pictures().then(data => {
    res.send(data)
  })
})
console.log(port)
app.listen(port, () => {
  console.log(`Example app listening on port ${port}!`)
})

db.js

const fs = require('fs')
class Database {
  pictures () {
    return this.read()
  }
  read (cb) {
    return new Promise((resolve, reject) => {
      fs.readFile('./posts.json', 'utf-8', (err, data) => {
        if (err) {
          reject(err)
        } else {
          resolve(data)
        }
      })
    })
  }
}

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