Здравствуйте, я новичок в Node, express и pug. Я пытаюсь отобразить объект в представлении, и я получаю сообщение об ошибке мопса. Или, по крайней мере, я думаю, что это ошибка мопса. Я использую pugcli, и когда он пытается отобразить html, я получаю сообщение об ошибке.

Ошибка pugcli отображается на терминале как:

Невозможно прочитать свойство "длина", равное неопределенному

Это странно, потому что когда я пытаюсь просмотреть его в браузере, даже если pug cli показывает ошибку, браузер показывает список, но со всеми пустыми элементами <li>.

Я хочу, чтобы <li> отображал идентификатор, имя и возраст объекта

Я понимаю, что в мопсе для рендеринга объекта вам нужно перебрать его с помощью какого-либо цикла for. Я написал это в файле мопса, но объекты не отображаются.

Я был бы признателен за помощь в том, чего мне не хватает в коде, или если я как-то полностью испортил код?

Моя настройка следующая

bin/www
public
   javascripts
   stylesheets
routes
   index.js
views
   index.pug
   layout.pug
   ...
app.js

Мой index.pug:

extends layout
block content
  h1= title
  p Welcome to #{appHeading}
  div
    ul
      for user, i in users
        li= users.name +" - "+ users.id
      li=number

Это мой index.js:

var express = require('express');
var router = express.Router();
var users = [
  {
    id: 0,
    name: 'Glenn',
    age: 40
  },
  {
    id: 1,
    name: 'Jeff',
    age: 37
  },
  {
    id: 2,
    name: 'Sara',
    age: 22
  },
  {
    id: 3,
    name: 'Bill',
    age: 41
  },
  {
    id: 4,
    name: 'Mary',
    age: 29
  },

];
var appHeading = 'my object render app ' 
var number = 42;
/* GET home page. */
router.get('/', function(req, res, next) {

  //res.json(users);
  //res.send('Is this working?')
  res.render('index', { 
    title: 'This is my app to render objects in pug',
    users,
    number,
    appHeading
  });
});
module.exports = router;

А мой app.js:

const createError = require('http-errors');
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const bodyParser = require('body-parser');

const indexRouter = require('./routes/index.js');
const usersRouter = require('./routes/users.js');

const app = express();

/*const logging = function(req, res, next){
  console.log('Logging....')
  next();
}
*/
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(logger('dev'));
//Body Parser middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended : false}));
//app.use(express.json());
//app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
//app.use(logging);
app.use('/', indexRouter);
app.use('/users', usersRouter);

// 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');
});


app.listen(port=3000 , function(){
  console.log('Server started on port '+ port);
})
module.exports = app;
1
digitalguru 15 Ноя 2018 в 05:42

1 ответ

Лучший ответ

Похоже, это все-таки опечатка:

extends layout
block content
  h1= title
  p Welcome to #{appHeading}
  div
    ul
      for user, i in users
        li= user.name +" - "+ user.id
      li=number

Это сработает. Произошло то, что вы обращались к users (массиву), а не к user (повторяемому объекту). Я пробовал код на своей машине и работает нормально.

0
Juan D. Gómez 15 Ноя 2018 в 13:51