Dzień dobry. Mam pewien mały problem. Obecnie uczę się node.js i express'a i chciałem sobie poćwiczyć tworząc prosty projekt wysyłania i wyświetlania komentarzy na stronie internetowej. Komentarze umieszczane są w pliku json i wysyłane za pomocą prostego formularza w pug. Wysyłanie działa, jednak mam problem z wyświetleniem komentarzy. Wiem, że moduł fs jest asynchroniczny i z tego też względu mam duży problem, gdyż przekazanie danych z CommentController.js do index.js powoduje zwrot wartości w postaci undefined. Liczę na pomoc :)
index.js
const express = require('express');
const router = express.Router();
const CommentController = require('../controllers/CommentController');
/* GET home page. */
router.get('/', function(req, res, next) {
CommentController.getObject;
res.render('index', { title: 'Komentarze'});
});
router.post('/', CommentController.store)
module.exports = router;
CommentController.js
const fs = require('fs');
function getObject(data) {
return data;
}
module.exports = {
store: (req, res) => {
let name = req.body.name;
let comment = req.body.comment;
if(name == '' || comment == '') {
res.render('index', {title: 'Komentarze', error: 'Musisz wypełnić formularz'});
} else {
fs.readFile('data.json', 'utf-8', (err, data) => {
if(err) return res.render('index', {title: 'Komentarze', error: 'Nie udało się wysłać komentarza'});
else {
let arrayObjects = JSON.parse(data);
arrayObjects.comments.push({
"name": name,
"comment": comment
});
fs.writeFile('data.json', JSON.stringify(arrayObjects), 'utf-8', (err) => {
if(err) return res.render('index', {title: 'Komentarze', error: 'Musisz wypełnić formularz'});
else {
res.render('index', {title: 'Komentarze', success: 'Komentarz został wysłany!'});
}
});
}
});
}
},
object: () => {
fs.readFile('data.json', 'utf-8', (err, data) => {
if(err) return res.render('index', {title: 'Komentarze', error: 'Nie można wyświetlić listy komentarzy!'});
else {
let jsonData = JSON.parse(data);
let objectList = jsonData.comments;
return objectList;
}
});
}
};
index.pug
extends layout
block content
header
.container
h1= title
p Wypełnij formularz, aby dodać komentarz
.container
form(action="/" method="POST")
input(type="text" name="name" placeholder="Wpisz swoją nazwę")
textarea(type="text" name="comment" placeholder="Treść komentarza")
button(id="comment-submit" class="btn-primary") Wyślij
.alert-box
p(class="error-alert")= error
p(class="success-alert")= success
.comments-object
.comment-name
p
.comment-body
p
app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
Pozdrawiam :)