Javascript 如果catch()结尾没有空返回,为什么node.js代码会失败?

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", "

我一直在学习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",
  "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是明智的主意吗?现在这是正确的。关于“聪明的想法”——如果你的代码不应该继续运行——是的。这真的取决于里面发生了什么。。。