Есть пара вещей, которые я вижу, которые не соответствуют вашему коду. Вы вызываете асинхронный метод в своем конструкторе, чего не следует делать. Вы планируете вызывать 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