javascript - ENOENT:没有这样的文件或目录
问题描述
我基于此示例https://github.com/lyndachiweteu/using-passport-with-sequelize-and-mysql制作了一个带有身份验证的小项目。我有一个错误“错误:ENOENT:没有这样的文件或目录,打开 'C:\Users\user\Desktop\using-passport-with-sequelize-and-mysql-master\app\views\layouts\main.hbs' ” 但我并没有指着这个方向,这很奇怪。我求你帮助我,伙计们<3
我已经尝试过这样做,并创建这样的文件(main.hbs),但在这种情况下,我无法到达其他路径(仪表板,登录)。在这种情况下,它们都具有来自 main.hbs 的相同 html 代码
服务器.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)
});
应用程序/路由/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');
}
}
应用程序/控制器/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'
解决方案
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>
推荐阅读
- php - 第一条语句执行,但第二条语句不执行
- sql - 在sql中设置记录集的批号
- python - python sqlite为什么将值解释为列
- javascript - 如何在多维数组上使用 FILTER 来检索唯一值?
- nginx - 最新 Docker 映像的服务器名称中的参数数量无效
- html - 如何将多个 a 标签彼此对齐?
- java - 在Java中读取输入整数
- react-native - 如何从一个堆栈屏幕导航到另一个堆栈屏幕?
- android - Flutter - WebView 不适用于 Android
- javascript - 当自定义参数从子组件获取数据时,如何在 React 中除了您自己的自定义参数之外传递事件参数