【问题标题】:ENOENT: no such file or directoryENOENT:没有这样的文件或目录
【发布时间】:2023-03-31 00:31:01
【问题描述】:

我根据这个例子https://github.com/lyndachiwetelu/using-passport-with-sequelize-and-mysql做了一个带有身份验证的小项目。我有一个错误“错误:ENOENT:没有这样的文件或目录,打开 'C:\Users\user\Desktop\using-passport-with-sequelize-and-mysql-master\app\views\layouts\main.hbs' " 但是我没有在任何地方指向这个方向,这很奇怪。我求你帮助我,伙计们

我已经尝试过这样做,并创建这样的文件(main.hbs),但在这种情况下,我无法访问其他路径(仪表板,登录)。在这种情况下,它们都具有来自 main.hbs 的相同 html 代码

server.js:

var express    = require('express')
var app        = express()
var passport   = require('passport')
var session    = require('express-session')
var bodyParser = require('body-parser')
var env        = require('dotenv').config()
var exphbs     = require('express-handlebars')



//For BodyParser
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());


 // For Passport
app.use(session({ secret: 'keyboard cat',resave: true, 
saveUninitialized:true})); // session secret
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions


 //For Handlebars
app.set('views', './app/views')
app.engine('hbs', exphbs({extname: '.hbs'}));
app.set('view engine', '.hbs');


app.get('/', function(req, res){
  res.send('Welcome to Passport with Sequelize');
});


//Models
var models = require("./app/models");


//Routes
var authRoute = require('./app/routes/auth.js')(app,passport);


//load passport strategies
require('./app/config/passport/passport.js')(passport,models.user);


//Sync Database
models.sequelize.sync().then(function(){
console.log('Nice! Database looks fine')

}).catch(function(err){
console.log(err,"Something went wrong with the Database Update!")
});



app.listen(5000, function(err){
    if(!err)
    console.log("Site is live"); else console.log(err)

});

app/routes/auth.js :

var authController = require('../controllers/authcontroller.js');

module.exports = function(app,passport){

app.get('/signup', authController.signup);


app.get('/signin', authController.signin);


app.post('/signup', passport.authenticate('local-signup',  { successRedirect: '/dashboard',
failureRedirect: '/signup'}
                                                ));


 app.get('/dashboard',isLoggedIn, authController.dashboard);


 app.get('/logout',authController.logout);


 app.post('/signin', passport.authenticate('local-signin',  { successRedirect: '/dashboard',
 failureRedirect: '/signin'}
                                                ));


 function isLoggedIn(req, res, next) {
if (req.isAuthenticated())
    return next();

 res.redirect('/signin');

}

}

app/controller/authcontroller.js:

 var exports = module.exports = {}


 exports.signup = function(req,res){

 res.render('signup'); 

}

 exports.signin = function(req,res){

 res.render('signin'); 

}

 exports.dashboard = function(req,res){

 res.render('dashboard'); 

}

  exports.logout = function(req,res){

  req.session.destroy(function(err) {
  res.redirect('/');

});

}

在文件夹“app\views”中只有带有 html 代码的文件,所以我不显示它们。

我还是不明白程序在哪里走这条路径\app\views\layouts\main.hbs

问题:错误:ENOENT:没有这样的文件或目录,打开 'C:\Users\user\Desktop\using-passport-with-sequelize-and-mysql-master\app\views\layouts\main.hbs'

error_screen

structure_screen

【问题讨论】:

  • 你能截图整个错误信息吗?
  • 这是整个错误消息。我的意思是程序工作(服务器是实时的),但是当我来到localhost:5000/signup 我得到这个错误:ENOENT:没有这样的文件或目录,打开 'C:\Users\user\Desktop\using-passport-with-sequelize -and-mysql-master\app\views\layouts\main.hbs'
  • 对,但是如果您截屏错误,它将提供有关错误发生位置的线索
  • 我已经添加了屏幕,和我在 Atom 中得到的一样
  • 好像是how it works

标签: javascript node.js sequelize.js


【解决方案1】:

Express-Handlerbars(您正在使用的视图引擎)需要一个 main 布局文件,您可以在文档中看到该文件(搜索“main.handlebars”)https://github.com/ericf/express-handlebars

你还可以在https://github.com/ericf/express-handlebars#basic-usage下看到express handlebars期望的目录结构

这充当您的其他视图扩展的“主要”布局。所以你可以把通用代码放在main中,比如导航栏等。

您可以关注文档,也可以在渲染视图时使用 {layout:false} 作为传入的道具之一,例如

res.render('home', {layout: false});

看看这是否有效。你也可以在这里阅读defaultLayout https://github.com/ericf/express-handlebars#defaultlayout

您可以尝试将默认布局默认设置为 false,但我不知道这会产生什么影响或是否有其他意外后果。它甚至可能根本不起作用。

app.engine('hbs', exphbs({extname: '.hbs', defaultLayout:false}));

最好的办法是使用主布局,这样您就可以将通用代码放在那里,例如,如果您想更新您的徽标,您只需在一个地方而不是每个视图中进行。

为此,在您的“views”目录中创建另一个名为“layouts”的目录并添加一个名为“main.hbs”的文件,其中包含以下代码。 {{{body}}} 区域是您来自其他视图的代码将被呈现的地方。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Example App</title>
</head>
<body>

    {{{body}}}

</body>
</html>

【讨论】:

  • 那我怎么写目录(dashboard, sigup)?据我了解,Cz 现在在我的程序中看不到它们。
  • 而且,据我所知,我需要把这个 res.render('home', {layout: false});使用我的目录?
  • 要么按照我链接的文档中的概述创建主文件,要么使用 res.render 方法并将 defaultLayout 设置为 false ,正如我所提到的。老实说,你会想要一个 main 布局,这样你就不会将相同的 html 代码复制/粘贴到每个页面,这也会使更新成为一场噩梦
  • 您可以使用res.render('signup', {defaultLayout:false}); 之类的内容作为示例
  • 但是我将如何显示仪表板的路径,cz 正如我在这里的问题中所说的那样,如果我根据需要使用主目录,每个页面(仪表板,登录)都从相同的 html 代码main.hbs
猜你喜欢
  • 1970-01-01
  • 2018-07-03
  • 2014-01-12
  • 1970-01-01
  • 2013-07-28
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多