简体   繁体   中英

“Users not defined” in node.js

I'm using EJS as my template engine. My browser says "users" is not definded, but in my server.js file, i've defined it as var users = require("./routes/userws) When i start up my server and access the applicaiton, i get the following error message in my browser (Chrome):

ReferenceError: C:\Users\Corfi\Google Drive\Coding\webdev\site\views\index.ejs:27
    25| <h1>hello</h1>

    26|     <ul>

 >> 27|     <% users.forEach(function(user) { %>

    28|         <li><%= user.first_name +  " " + user.last_name %> - <a  data-id="<%= user._id%>" class= "deleteUser" href="#">Delete</a></li>

    29|    <% })%>

    30|    </ul> 


users is not defined
    at eval (eval at compile (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\ejs\lib\ejs.js:549:12), <anonymous>:37:8)
    at returnedFn (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\ejs\lib\ejs.js:580:17)
    at tryHandleCache (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\ejs\lib\ejs.js:223:34)
    at View.exports.renderFile [as engine] (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\ejs\lib\ejs.js:437:10)
    at View.render (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\view.js:127:8)
    at tryRender (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\application.js:640:10)
    at EventEmitter.render (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\application.js:592:3)
    at ServerResponse.render (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\response.js:971:7)
    at C:\Users\Corfi\Google Drive\Coding\webdev\site\routes\index.js:6:9
    at Layer.handle [as handle_request] (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\router\index.js:275:10)
    at Function.handle (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\router\index.js:174:3)
    at router (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\router\index.js:47:12)
    at Layer.handle [as handle_request] (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\router\index.js:317:13)
    at C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\Users\Corfi\Google Drive\Coding\webdev\site\node_modules\express\lib\router\index.js:335:12).

My server.js file is as follows:

//Declare which modules are required
var express = require("express");
var cookieParser = require("cookie-parser");
var flash = require("connect-flash");
var session = require("express-session");
var passport = require("passport");
var LocalStrategy = require("passport-local").Strategy;
var bodyParser = require("body-parser");
var path = require("path");
var expressValidator = require("express-validator");

//MongoDB
var mongo = require("mongo");
//MongoDb - Mongojs
var mongojs = require("mongojs");
var db = mongojs("bank", ["users"])
var ObjectId = mongojs.ObjectId
//MongoDB - Mongoose
var mongoose = require("mongoose")
var mongooseConnect = mongoose.connect('mongodb://localhost/bank', {
  useMongoClient: true,
});

//Routes
var routes = require("./routes/index");
var users = require("./routes/users");

//Express server
var server = express();

//Avoid errors
server.disable("x-powered-by");

//View Engine                                                   
server.set("view engine", "ejs");  
server.set("views", path.join(__dirname, "views"));

//Body Parser Middleware
server.use(bodyParser.json());
server.use(bodyParser.urlencoded({extended: false}));

//Express Session Middleware
server.use(session({
    secret: "secret",
    saveUninitialized: true,
    resave: true
}))

//Passport Setup
server.use(passport.initialize());
server.use(passport.session());


//Express-Validator Middleware
server.use(expressValidator({
  errorFormatter: function(param, msg, value) {
      var namespace = param.split('.')
      , root    = namespace.shift()
      , formParam = root;

    while(namespace.length) {
      formParam += '[' + namespace.shift() + ']';
    }
    return {
      param : formParam,
      msg   : msg,
      value : value
    };
  }
}));

//Connect Flash Middleware
server.use(flash());


// Global Vars
server.use(function(req, res, next) {
    res.locals.errors = null;
//Global vars - Connect Flash
    res.locals.success_msg = req.flash("success_msg");
    res.locals.error = req.flash("error");
    next();
})

//Set up static path; set up delivery of CSS and client-side JavaScript
server.use(express.static(path.join(__dirname, 'public')));
// Mongojs: - Find everything
db.users.find(function (err, docs) {
    console.log(docs);
    //Routing
    server.get("/", function(req, res) {
        res.render("index", {
            title: "Customers",
            users: docs
        });
    })

})

//Routing Middleware
server.use("/", routes);
server.use("/users", users)

//Form validation
server.post("/users/add", function(req, res) {
    req.checkBody("first_name", "First Name is Required").notEmpty();
    req.checkBody("last_name", "Last Name is Required").notEmpty();
    req.checkBody("email", "Email is Required").notEmpty();

    //Get errors
    var errors = req.validationErrors();
    //If there are any errors --> returns truthy value
    if (errors) {
       //Render index page with applicable error messages 
        res.render("index", {
            title: "Customers",
            users: users,
            errors: errors
        });
    }
        //If there are no errors --> Request first name, last name, and email adress, and log them in console.
    else {
         var newUser = {
        first_name: req.body.first_name,
        last_name: req.body.last_name,
        email: req.body.email
    }};
    //When form is submitted, log erros if there are any,
    //and create a new user if there aren't any errors.
    db.users.insert(newUser, function(err, result) {
        if(err) {
        console.log(err);
        }
        else {
        res.redirect("/");
        }
    })
    }
    )
//End form validation

    //Set up user delete functionality
    server.delete("/users/delete/:id", function(req, res) {
        db.users.remove(
        {
        _id: ObjectId(req.params.id)
        }, function(err, result) {
        if(err){
             console.log(err);};
        res.redirect("/");})
        })
    ;

   //Set Port
   var port = 5000
   server.set("port", process.env.PORT || 5000);
   server.listen(port, function() {
        console.log("Server started on Port" + " " +port)
   })

Index.ejs file:

<% include partials/header  %>
<h1>Add Customer</h1>
<% if(errors) {%>
    <ul>
    <%errors.forEach(function(error) { %>
        <li><%= error.msg %></li>
   <% })%>
    </ul>
<% } %>
<form method = "POST" action="/users/add">
    <label>First Name</label> <br>
    <input type="text" name="first_name">
    <br>
    <label>Last Name</label> <br>
    <input type="text" name="last_name">
    <br>
    <label>E-mail</label> <br>
    <input type="email" name="email">
    <br><br>
    <input type="submit" value="Submit">
</form> 
<div id="testjs">
Hello there    
</div>   
<h1>hello</h1>
    <ul>
    <% users.forEach(function(user) { %>
        <li><%= user.first_name +  " " + user.last_name %> - <a  data-id="<%= user._id%>" class= "deleteUser" href="#">Delete</a></li>
   <% })%>
   </ul> 
   <% include partials/footer %>   

I don't think i have any more relevant details to add, but Stackoverflow insists i add more details, so I don't really know what to type here, etc., etc.

you didn't defined and pass users in the route which call your index.ejs. Look into your file /routes/index in the function defined for this URL.

In the res.render, you need to pass your users variable if you want to be able to access it in your template/view

app.get('/', function (req, res) {
  res.render('index', { users: '[usersList]'});
});

Only the variable you pass from the route to the template inside res.render will be accessible in your HTML. Every other stuff stay available in nodejs, but not in your templating engine

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM