Javascript 如果catch()结尾没有空返回,为什么node.js代码会失败?
我一直在学习Node,虽然我理解所有的代码,以及它所做的事情,但有一件事困扰着我。这就是代码:Javascript 如果catch()结尾没有空返回,为什么node.js代码会失败?,javascript,node.js,Javascript,Node.js,我一直在学习Node,虽然我理解所有的代码,以及它所做的事情,但有一件事困扰着我。这就是代码: const http = require('http'); var url = require('url'); var path = require('path'); var fs = require('fs'); // array of mime types var mimeTypes = { "html" : "text/html", "jpeg" : "image/jpeg", "
const http = require('http');
var url = require('url');
var path = require('path');
var fs = require('fs');
// array of mime types
var mimeTypes = {
"html" : "text/html",
"jpeg" : "image/jpeg",
"jpg" : "image/jpeg",
"png" : "image/png",
"js" : "text/javascript",
"css" : "text/css"
}
// create Server
http.createServer( (req, res) => {
var uri = url.parse(req.url).pathname;
var fileName = path.join(process.cwd(),unescape(uri));
console.log('Loading ' + process.cwd() + uri);
var stats;
try{
stats = fs.lstatSync(fileName);
} catch(err) {
res.writeHead(404, {'Content-Type' : 'text/plain'});
res.write('404 Not found\n');
res.end();
return; // if I remove this my code fails.
}
// check if file or directory
if (stats.isFile()) {
var mimeType = mimeTypes[path.extname(fileName).split(".").reverse()[0]]
res.writeHead(200, {'Content-Type': mimeType});
var fileStream = fs.createReadStream(fileName);
fileStream.pipe(res);
} else if (stats.isDirectory()) {
res.writeHead(200 , {
"Location" : "index.html"
});
res.end();
} else {
res.writeHead(500, {"Content-Type" : "text/plain"});
res.write("500 Internal Error\n");
res.end();
}
}).listen(8080);
所以,如果我删除catch块中的空白return,我的代码将失败
返回:
不退还:
返回是否允许继续执行,有人能解释吗?
谢谢 如果在
catch
块内不返回
,则代码将继续运行并到达下一行:
stats.isFile()
现在,
stats
没有定义,因为那里有一个异常,所以您的代码实际上是undefined.isFile()
,这将在那里引发另一个异常。我想您希望res.end()
将停止函数执行/请求处理,但它只关闭响应主体。然后可以返回响应,但try/catch块之后的代码继续运行并遇到问题。停止执行的唯一正确方法是返回代码>语句。返回
停止当前块的终止。因此,当您使用return
时,不会执行以下语句。由于读取stats
会引发异常,但在try-catch块中被捕获,所以程序继续运行,并且stats
保持未定义状态。然后尝试访问stats.isFile()
会引发一个未捕获的异常。这个问题可以归结为function foo(){return;console.log(“hello”)}foo()
lstatSync
,您可以在node.js中使用任何同步函数,是削弱缩放能力的可靠方法。@keith在这种情况下你有什么建议?改用lstat
。因此,如果我不添加return,我就没有stats的值,因为try-catch不会为stats变量返回任何值。不,这不是我要说的。再看一遍:)我现在明白了,我的异常没有被处理,并且正在命中另一个异常,但是return结束了该块并存在一个catch,它的stats.isFile()值是正确的,对这种情况使用空白return是明智的主意吗?现在这是正确的。关于“聪明的想法”——如果你的代码不应该继续运行——是的。这真的取决于里面发生了什么。。。