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.