繁体   English   中英

node.js-Express 4. *路由使用根目录而不是本地目录

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM