【问题标题】:SyntaxError: Unexpected token / in .... while compiling ejs | Node.js with MongoDBSyntaxError: Unexpected token / in .... while compile ejs | Node.js 与 MongoDB
【发布时间】:2020-04-10 13:42:33
【问题描述】:

当我尝试在包含

的文件中使用 <% include ./partials/messages %><%= include ./partials/messages %> 甚至 <%= include ./partials/messages { %>
<!-- REGISTER.EJS -->

<div class="row mt-5">
    <div class="col-md-6 m-auto">
        <div class="card card-body">
            <h1 class="text-center mb-3">
                <i class="fas fa-user-plus"></i> Register
            </h1>
            <% include ./partials/messages %>
            <form action="/users/register" method="POST">
                <div class="form-group">
                    <label for="name">Name</label>
                    <input
                        type="name"
                        id="name"
                        name="name"
                        class="form-control"
                        placeholder="Enter Name"
                        value="<%= typeof name != 'undefined' ? name : '' %>"
                    />
                </div>
                <div class="form-group">
                    <label for="email">Email</label>
                    <input
                        type="email"
                        id="email"
                        name="email"
                        class="form-control"
                        placeholder="Enter Email"
                        value="<%= typeof email != 'undefined' ? email : '' %>"
                    />
                </div>
                <div class="form-group">
                    <label for="password">Password</label>
                    <input
                        type="password"
                        id="password"
                        name="password"
                        class="form-control"
                        placeholder="Create Password"
                        value="<%= typeof password != 'undefined' ? password : '' %>"
                    />
                </div>
                <div class="form-group">
                    <label for="password2">Confirm Password</label>
                    <input
                        type="password"
                        id="password2"
                        name="password2"
                        class="form-control"
                        placeholder="Confirm Password"
                        value="<%= typeof password2 != 'undefined' ? password2 : '' %>"
                    />
                </div>
                <button type="submit" class="btn btn-primary btn-block">
                    Register
                </button>
            </form>
            <p class="lead mt-4">Have An Account? <a href="/users/login">Login</a></p>
        </div>
    </div>
</div>

我收到以下错误“SyntaxError: Unexpected token / in .... while compile ejs”。我正在使用它向尝试注册的用户添加即时反馈,例如“密码无效”或“电子邮件已存在”。我相信我的 messages.ejs 文件设置正确:

<% if(typeof errors != 'undefined') { %>
<% errors.forEach(function(error) { %>
  <div class="alert alert-warning alert-dismissible fade show" role="alert">
    <%= error.msg %>
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
      <span aria-hidden="true">&times;</span>
    </button>
  </div>
<%}); %>
<% } %>

<% if(success_msg != '') { %>
  <div class="alert alert-success alert-dismissible fade show" role="alert">
    <%= success_msg %>
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
      <span aria-hidden="true">&times;</span>
    </button>
  </div>
<% } %>

<% if(error_msg != '') { %>
  <div class="alert alert-warning alert-dismissible fade show" role="alert">
    <%= error_msg %>
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
      <span aria-hidden="true">&times;</span>
    </button>
  </div>
<% } %>

<% if(error != '') { %>
  <div class="alert alert-warning alert-dismissible fade show" role="alert">
    <%= error %>
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
      <span aria-hidden="true">&times;</span>
    </button>
  </div>
<% } %>

我很迷茫。我相信我已经正确添加了const example = require('example'); 文件。我的 app.js 文件看起来像

const express = require('express');
const expressLayouts = require('express-ejs-layouts');
const mongoose = require('mongoose');
const flash = require('connect-flash');
const session = require('express-session');
const passport = require('passport');

const app = express();

// Passport Config
require('./config/passport')(passport);

// DB Config
const db = require('./config/keys').mongoURI;

// Connect to MongoDB
mongoose
  .connect(
    db,
    { useNewUrlParser: true }
  )
  .then(() => console.log('MongoDB Connected'))
  .catch(err => console.log(err));

app.use(express.static( 'public' ));

// EJS
app.use(expressLayouts);
app.set('view engine', 'ejs');

// Bodyparser 
app.use(express.urlencoded({ extended: false }));

// Express Session
app.use(session({
  secret: 'secret',
  resave: true,
  saveUninitialized: true
}))

// Passport Middleware
app.use(passport.initialize());
app.use(passport.session());

// Connect Flash
app.use(flash());

// Global Variables
app.use((req, res, next) => {
  res.locals.success_msg = req.flash('success_msg');
  res.locals.error_msg = req.flash('error_msg');
  res.locals.error = req.flash('error');
  next();
});

// Routes
app.use('/', require('./routes/index'));
app.use('/users', require('./routes/users'));

const PORT = process.env.PORT || 5000;

app.listen(PORT, console.log(`Server started on port ${PORT}`));

我的文件结构如下:

>config
     auth.js
     keys.js
     passport.js
>models
     User.js
>node_modules
>public
>routes
     index.js
     users.js
>views
     >partials
        messages.ejs
     dashboard.ejs
     layout.ejs
     login.ejs
     register.ejs
     welcome.ejs
.gitignore
app.js
package-lock.json
package.json
README.md

有人有什么想法吗?

错误信息如下所示:

SyntaxError: Unexpected token / in C:\Users\jreed\Desktop\appproject\views\register.ejs while compiling ejs

If the above error is not helpful, you may want to try EJS-Lint:
https://github.com/RyanZim/EJS-Lint
Or, if you meant to create an async function, pass `async: true` as an option.
    at new Function (<anonymous>)
    at Template.compile (C:\Users\jreed\Desktop\appproject\node_modules\ejs\lib\ejs.js:626:12)
    at Object.compile (C:\Users\jreed\Desktop\appproject\node_modules\ejs\lib\ejs.js:366:16)
    at handleCache (C:\Users\jreed\Desktop\appproject\node_modules\ejs\lib\ejs.js:215:18)
    at tryHandleCache (C:\Users\jreed\Desktop\appproject\node_modules\ejs\lib\ejs.js:254:16)
    at View.exports.renderFile [as engine] (C:\Users\jreed\Desktop\appproject\node_modules\ejs\lib\ejs.js:459:10)
    at View.render (C:\Users\jreed\Desktop\appproject\node_modules\express\lib\view.js:135:8)
    at tryRender (C:\Users\jreed\Desktop\appproject\node_modules\express\lib\application.js:640:10)
    at Function.render (C:\Users\jreed\Desktop\appproject\node_modules\express\lib\application.js:592:3)
    at ServerResponse.render (C:\Users\jreed\Desktop\appproject\node_modules\express\lib\response.js:1012:7)
    at ServerResponse.res.render (C:\Users\jreed\Desktop\appproject\node_modules\express-ejs-layouts\lib\express-layouts.js:77:18)
    at router.get (C:\Users\jreed\Desktop\appproject\routes\users.js:13:43)
    at Layer.handle [as handle_request] (C:\Users\jreed\Desktop\appproject\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\jreed\Desktop\appproject\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\jreed\Desktop\appproject\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\jreed\Desktop\appproject\node_modules\express\lib\router\layer.js:95:5)

这是我的 users.js 文件:

<!-- USERS.JS -->

const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const passport = require('passport');

// User Model
const User = require('../models/User');

// Login Page
router.get('/login', (req, res) => res.render('login'));

// Register Page
router.get('/register', (req, res) => res.render('register'));

// Register Handle
router.post('/register', (req, res) => {
    const {name, email, password, password2} = req.body;
    let errors = [];

    // Check required fields
    if (!name || !email || !password || !password2) {
        errors.push({msg: 'Please enter all fields'});
    }

    // Check passwords match
    if (password != password2) {
        errors.push({msg: 'Passwords do not match'});
    }

    // Check password length
    if (password.length < 6) {
        errors.push({msg: 'Password must be at least 6 characters'});
    }

    if (errors.length > 0) {
        res.render('register', {errors, name, email, password, password2});
    } else { // Validation passed
        User.findOne({email: email}).then(user => {
            if (user) { // User Exists
                errors.push({msg: 'Email is already registered'})
                res.render('register', {errors, name, email, password, password2});
            } else {
                const newUser = new User({
                    name,
                    email,
                    password
                });

                // Hash Password
                bcrypt.genSalt(10, (err, salt) => bcrypt.hash(newUser.password, salt, (err, hash) => {
                    if(err) throw err;
                    // Set password to hashed
                    newUser.password = hash;
                    // Save user
                    newUser.save()
                        .then(user => {
                            req.flash('success_msg', 'Congratulations! You are now registered and can log in.');
                            res.redirect('/users/login');
                        })
                        .catch(err => console.log(err));
                }))
            }
        });
    }

});

// Login Handle
router.post('/login', (req, res, next) => {
    passport.authenticate('local',{
        successRedirect: '/dashboard',
        failureRedirect: '/users/login',
        failureFlash: true
    })(req, res, next);
});

// Logout Handle
router.get('/logout', (req, res) => {
    req.logout();
    req.flash('success_msg', 'You are logged out.');
    res.redirect('/users/login');
});

module.exports = router;

【问题讨论】:

  • 我在我的机器上运行了你的代码,它运行良好。确切的错误信息是什么?你能追踪到某个文件/行号吗?您的 messages.ejs 文件以及包含它的文件都没有损坏,所以我认为必须有其他东西抛出错误。
  • 感谢您与我们联系。这是我收到的确切错误SyntaxError: Unexpected token / in C:\Users\jreed\Desktop\appproject\views\register.ejs while compiling ejs
  • 我检查了控制台,这是我收到的错误消息Refused to load the font '&lt;URL&gt;' because it violates the following Content Security Policy directive: "default-src 'none'". Note that 'font-src' was not explicitly set, so 'default-src' is used as a fallback.
  • SyntaxError 没有行号?知道文件还不错,可能把register.ejs的全部内容贴出来让我看看。您是否在某处加载外部字体,该控制台错误很奇怪,但可能只是浏览器问题,与您的应用程序无关。如果您安装了它,可能是“语法”:stackoverflow.com/a/50672596/5347875
  • 我会将整个错误添加到原始帖子中。我似乎无法在评论中添加超过一定数量的字符。关于 Grammarly,我确实尝试删除扩展名并尝试在 Internet Explorer 中运行 localhost:5000/users/register,但我遇到了相同的错误消息。我的 register.ejs 文件是您在前面看到的第一个主要代码块,其中包含

标签: node.js mongodb formatting ejs web-development-server


【解决方案1】:

我想我解决了!

<%- include ('partials/messages') %>

我不知道为什么这是唯一有效的方法,现在正在尝试研究它。

【讨论】:

  • 如果我可以给你寄饼干,我会的。你真棒。非常感谢。
  • @JaredReed 哈哈谢谢!不知道为什么在这种情况下需要这种语法。我还没有处理足够多的问题,不知道为什么它很糟糕。
  • 你练习和解决问题的次数越多,你就会变得越好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 2020-05-15
相关资源
最近更新 更多