2017-08-16 67 views
0

我正在使用EJS作爲我的模板引擎。我的瀏覽器顯示「用戶」未定義,但在我的server.js文件中,我將其定義爲var users = require("./routes/userws)當我啓動服務器並訪問應用程序時,我在我的瀏覽器(Chrome)中收到以下錯誤消息:node.js中的「用戶未定義」

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). 

我server.js文件如下:

//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("https://stackoverflow.com/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("https://stackoverflow.com/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文件:

<% include partials/header %> 
<h1>Add Customer</h1> 
<% if(errors) {%> 
    <ul> 
    <%errors.forEach(function(error) { %> 
     <li><%= error.msg %></li> 
    <% })%> 
    </ul> 
<% } %> 
<form method = "POST" action="https://stackoverflow.com/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 %> 

我不認爲我有任何更多的相關細節補充,但#1堅持我加m礦石的細節,所以我真的不知道該在這裏輸入什麼等,等等。

+0

您的瀏覽器如何知道'users'是否已定義? – Luca

回答

1

你沒有定義並通過users通過你的index.ejs路由。 在爲此URL定義的函數中查看您的文件/routes/index

在res.render,你需要,如果你希望能夠訪問它在你的模板/視圖

你的路線傳遞到模板中
app.get('/', function (req, res) { 
    res.render('index', { users: '[usersList]'}); 
}); 

只有變量傳遞您的users變量您的HTML中可以訪問res.render。其他所有東西都可以在nodejs中使用,但不能在您的模板引擎中使用

+0

我不太明白你的意思。我究竟需要傳遞用戶?在server.js,我路由index.ejs?像這樣:'server.get(「/」,function(req,res){res.render(「index」,{title:「Customers」,users:「[usersList]」});'而不是'server .get(「/」,function(req,res){res.render(「index」,{title:「Customers」,users:docs});'? –

+0

其中定義了捕獲url的路由來顯示這個頁面? – sheplu

+0

對不起,我是noob。你的意思是這樣的:'var users = require(「./ routes/users); server.use(」/ users,users)'?這是在我的server.js文件中 –