在 nodejs 服务器中提供 html 文件
Serve html file in nodejs server
在我尝试将我的代码分成路由、控制器等之前,我一直做得很好。现在我在尝试加载 html 文件时遇到错误。当我转到 link http://localhost:3000/ 时,我收到此错误 Error: ENOENT: no such file or directory, stat '/views/index.html'
这是我的routes.js代码
module.exports = function (app) {
var userController = require('../controllers/userController');
// app.use(require('express').static('../app/views/index.html'));
app.get('/', userController.renderHomePage);
app.post('/find', userController.getUser);
app.get('/get', userController.getUsers);
app.post('/add', userController.addUser);
}
这是我的 userController.js 文件
var mongoose = require('mongoose');
var User = require('../models/user');
var express = require('express');
var app = express();
app.use(express.static('../app'));
exports.renderHomePage = function (req, res) {
res.sendFile('/views/index.html');
}
exports.addUser = function(req,res){
console.log(req.body);
var newUser = new User({
name : req.body.name,
username : req.body.username,
password : req.body.password
});
newUser.save(function(err){
if(err){
console.log(err);
}
else{
console.log("User Saved successfully");
}
});
res.send(req.body);
};
exports.getUsers = function (req, res) {
// body...
User.find({}, function(error, users){
if(error){
console.log(error);
}
else{
res.send(users);
}
})
};
exports.getUser = function (req, res) {
// body...
console.log(req.body);
var data = req.body.username;
User.find({username : data}, function(err, user){
if(err){
throw err
}
else{
console.log(user);
res.send(user);
}
} );
};
这是我的 server.js
var express = require('express');
// var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var PORT = process.env.PORT || 3000;
var app = express();
var routes = require('./api/routes/routes');
routes(app);
var database = require('./config/database');
app.use(bodyParser.json());
app.listen(PORT, function(){
console.log("Server is running on port "+PORT);
})
这是我的文件夹结构。
服务器正常启动。而且我认为我已经正确地给出了路径。但我收到了错误。谁能帮我这个 ?谢谢。
编辑:
这就是我 link 将我的脚本编辑到 html 文件
的方式
<script src="/script/app.js"></script>
以 /
开头的路径是 绝对路径,这意味着它根据根目录解析(在 Windows 上,类似于 C:\
, 在 linux 上只是 /
).
您应该使用 path
模块来获取相对于模块目录的文件路径,如下所示:
var path = require('path');
var filePath = path.join(__dirname, 'relative/path/to/file');
__dirname
是一个特殊的模块范围变量,提供当前模块包含目录的路径。
app.use(express.static('../../app'))
尝试在您的 userController.js 文件中添加另一个“..”,只需添加一个 .. 即可将您置于 api 目录中。
包括 'path' 模块并更改
res.sendFile('/views/index.html');
至
res.sendFile(path.resolve(`${__dirname}/views/index.html`))
我运行遇到了这个问题。您正在发送带有 res.send 的 html 文件,但您的脚本不在静态可用文件可以访问的目录中。
刚看到你的编辑。通过您的编辑,您正在接近它。更改脚本包含的 HTML 文件中的引用。
两个月了,问题解决了吗?
如果没有,您是否尝试过该代码:
app.use(express.static('app'));
您提供给 static 函数的路径是相对于您 运行 节点进程所在的目录。
在你的例子中,你启动你的服务器 with/from server.js 文件(在根目录),所以你给static函数是相对于这个位置的。
在我尝试将我的代码分成路由、控制器等之前,我一直做得很好。现在我在尝试加载 html 文件时遇到错误。当我转到 link http://localhost:3000/ 时,我收到此错误 Error: ENOENT: no such file or directory, stat '/views/index.html'
这是我的routes.js代码
module.exports = function (app) {
var userController = require('../controllers/userController');
// app.use(require('express').static('../app/views/index.html'));
app.get('/', userController.renderHomePage);
app.post('/find', userController.getUser);
app.get('/get', userController.getUsers);
app.post('/add', userController.addUser);
}
这是我的 userController.js 文件
var mongoose = require('mongoose');
var User = require('../models/user');
var express = require('express');
var app = express();
app.use(express.static('../app'));
exports.renderHomePage = function (req, res) {
res.sendFile('/views/index.html');
}
exports.addUser = function(req,res){
console.log(req.body);
var newUser = new User({
name : req.body.name,
username : req.body.username,
password : req.body.password
});
newUser.save(function(err){
if(err){
console.log(err);
}
else{
console.log("User Saved successfully");
}
});
res.send(req.body);
};
exports.getUsers = function (req, res) {
// body...
User.find({}, function(error, users){
if(error){
console.log(error);
}
else{
res.send(users);
}
})
};
exports.getUser = function (req, res) {
// body...
console.log(req.body);
var data = req.body.username;
User.find({username : data}, function(err, user){
if(err){
throw err
}
else{
console.log(user);
res.send(user);
}
} );
};
这是我的 server.js
var express = require('express');
// var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var PORT = process.env.PORT || 3000;
var app = express();
var routes = require('./api/routes/routes');
routes(app);
var database = require('./config/database');
app.use(bodyParser.json());
app.listen(PORT, function(){
console.log("Server is running on port "+PORT);
})
这是我的文件夹结构。
服务器正常启动。而且我认为我已经正确地给出了路径。但我收到了错误。谁能帮我这个 ?谢谢。
编辑: 这就是我 link 将我的脚本编辑到 html 文件
的方式<script src="/script/app.js"></script>
以 /
开头的路径是 绝对路径,这意味着它根据根目录解析(在 Windows 上,类似于 C:\
, 在 linux 上只是 /
).
您应该使用 path
模块来获取相对于模块目录的文件路径,如下所示:
var path = require('path');
var filePath = path.join(__dirname, 'relative/path/to/file');
__dirname
是一个特殊的模块范围变量,提供当前模块包含目录的路径。
app.use(express.static('../../app'))
尝试在您的 userController.js 文件中添加另一个“..”,只需添加一个 .. 即可将您置于 api 目录中。
包括 'path' 模块并更改
res.sendFile('/views/index.html');
至
res.sendFile(path.resolve(`${__dirname}/views/index.html`))
我运行遇到了这个问题。您正在发送带有 res.send 的 html 文件,但您的脚本不在静态可用文件可以访问的目录中。 刚看到你的编辑。通过您的编辑,您正在接近它。更改脚本包含的 HTML 文件中的引用。
两个月了,问题解决了吗?
如果没有,您是否尝试过该代码:
app.use(express.static('app'));
您提供给 static 函数的路径是相对于您 运行 节点进程所在的目录。
在你的例子中,你启动你的服务器 with/from server.js 文件(在根目录),所以你给static函数是相对于这个位置的。