[英]node.js - Express 4.* routes use root not local directory
我完全是node.js的新手,并且正在udemy.com上过时且半破碎的课程中学习。
在上一课中,我已经成功地通过诸如
app.get('/vegetables',function(req,res) {
res.render('vegetables',{vegetables:vegetables});
})
在本课中,我看到了
Error: EPERM: operation not permitted, open 'C:\members' at Error (native)
我不明白为什么。 该应用程序将按预期启动,不会引发任何警告或错误,并且__dirname包含我期望的值,但每条路由都被解释为位于本地根目录C:中。
我究竟做错了什么?
var express = require('express'),
path = require('path'),
app = express(),
bodyParser = require('body-parser'),
logger = require('express-logger'),
port = 9000,
MongoClient = require('mongodb').MongoClient;
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(logger);
app.use(express.static(__dirname + '/public')); //establishes static file server on public dir
app.set('view engine', 'ejs');
MongoClient.connect('mongodb://127.0.0.1:27017/myExample',function(err,db) {
if(err) throw err;
var collection = db.collection('members');
var index = function(req,res) {
/*render the index view, and pass it members*/
collection.find().toArray(function(err,members) {
res.render('index',{members:members});
});
};
var addMember = function(req,res) {
collection.insert(req.body,function(err,docs) {
console.log(docs);
res.redirect('/members')
});
};
app.get('/members',index); //list all members
app.post('/members',addMember); //add a new member
app.listen(port);
console.log('server on %s',port);
console.log(__dirname );
});
process.on('uncaughtException',function(e) {
throw e;
});
记录器需要如下路径:
app.use(logger({path: "path/filename.txt"}));
有什么更好的办法让我找到答案吗?
您可以确定没有任何行在引起该错误的行之后。 console.log将起作用或记录行号的功能,如下所示:
function logLineNumber() {
var orig = Error.prepareStackTrace;
Error.prepareStackTrace = function(_, stack) {
return stack;
};
var err = new Error;
Error.captureStackTrace(err, arguments.callee);
var stack = err.stack;
Error.prepareStackTrace = orig;
console.log('Ran line: ',stack[0].getLineNumber());
}
像这样在快递中使用该功能:
app.use(function (req, res, next) {
logLineNumber();
next();
});
然后,您可以策略性地将此代码段放入代码中进行健全性检查,以确保确定错误是否在控制台中记录的最后一个行号之后:
var express = require('express'),
app = express(),
path = require('path'),
bodyParser = require('body-parser'),
logger = require('express-logger'),
port = 9000;
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(function (req, res, next) {
logLineNumber();
next();
});
app.use(logger);
app.use(function (req, res, next) {
logLineNumber();
next();
});
app.use(function (req, res, next) {
logLineNumber();
next();
});
app.use(function (req, res, next) {
logLineNumber();
next();
});
app.use(express.static(__dirname + '/public')); //establishes static file server on public dir
app.set('view engine', 'ejs');
var index = function (req,res) {
// render the index view, and pass it members
console.log('ran index!');
res.render('index');
};
var redir = function (req,res) {
// render the index view, and pass it members
res.redirect('/');
};
app.use(function (req, res, next) {
logLineNumber();
next();
});
app.get('/',index); //list all members
app.get('/redir',redir); //add a new member
app.listen(port);
console.log('server on %s',port);
console.log(__dirname );
process.on('uncaughtException',function(e) {
throw e;
});
function logLineNumber() {
var orig = Error.prepareStackTrace;
Error.prepareStackTrace = function(_, stack) {
return stack;
};
var err = new Error;
Error.captureStackTrace(err, arguments.callee);
var stack = err.stack;
Error.prepareStackTrace = orig;
console.log('Ran line: ',stack[0].getLineNumber());
}
当我运行以上命令并转到localhost:9000时,我得到以下控制台输出:
Ran line: 13
/Users/phillipsc/code/node/trash/stackoverflow/redirectRoot/index.js:71
throw e;
^
Error: EISDIR: illegal operation on a directory, open '/'
at Error (native)
直到第13行还可以,因为它记录了“ Ran line:13”。 该错误必须在第13行之后且在下一次在第20行调用logLineNumber之前发生,从而将其范围缩小到app.use(logger)。
修复记录器后,控制台将输出:
Ran line: 13
Ran line: 21
Ran line: 26
Ran line: 31
Ran line: 53
ran index!
尽管下面的代码对EISDIR错误没有帮助,但是下面的代码也可能会有所帮助。
获得更大的堆栈跟踪:
Error.stackTraceLimit = Infinity;
在错误处理程序中打印堆栈:
console.error(e.stack);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.