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

时间:2017-09-15 14:18:18

标签: 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",
  "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块中删除空白返回,我的代码将失败。

返回:

With return

不退货:

Without return

返回是否允许执行继续,任何人都可以解释? 谢谢。

2 个答案:

答案 0 :(得分:3)

如果您不在return区域内catch - 代码将继续运行并将转到以下行:

stats.isFile()

现在,stats未定义,因为那里存在异常,因此您的代码实际上是undefined.isFile(),这将在那里引发另一个异常。

答案 1 :(得分:3)

我认为你期望res.end()将停止函数执行/请求处理,而是只关闭响应体。然后可以返回响应,但是try / catch块之后的代码会继续并遇到问题。停止执行的唯一正确方法是return;语句。