为什么以及何时使用response.end()并在node.js中返回response.end()?

时间:2017-12-19 06:52:14

标签: javascript node.js

我最近开始学习node.js,并且我遇到了其中一章,以了解有关上传文件的信息。正如你可以看到下面的代码(我已经对我怀疑的行进行了评论),是否有必要写"返回res.end();"因为" res.end();"给出输出。所以,这里出现了一个问题,比如,什么时候,为什么以及在哪里使用' return'关键字以及' res.end()'。

var http = require('http');
var formidable = require('formidable');
var fs = require('fs');
var mv = require('mv');

http.createServer(function (req, res) {
  if (req.url == '/fileupload') {
    var form = new formidable.IncomingForm();
    form.parse(req, function (err, fields, files) {
      var oldpath = files.filetoupload.path;
      var newpath = 'C:/Users/Your Name/' + files.filetoupload.name;
      mv(oldpath, newpath, function (err) {
        if (err) throw err;
        res.write('File uploaded and moved!');
        res.end();
      });
 });
  } else {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write('<form action="fileupload" method="post"  enctype="multipart/form-data">');
    res.write('<input type="file" name="filetoupload"><br>');
    res.write('<input type="submit">');
    res.write('</form>');
    return res.end();//       <------------HERE
  }
}).listen(8080); 

1 个答案:

答案 0 :(得分:1)

return中的return res.end();仅用于代码流控制以退出函数,而不再执行该函数中的任何代码。调用请求处理程序回调的服务器不会关注返回值,因此代码不会尝试返回值。它只是停止在函数中进一步执行。

在特定的上下文中,您显示函数的最后一行res.end()的位置,res.end()return res.send()之间没有任何功能差异。

在其他一些上下文中,可能还有一些其他代码仍然可以在函数中执行,return是保持代码执行的一种方法。 return res.end()有时被用作避免else子句的快捷方式,如下所示:

 if (err) {
     return res.status(500).end();
 }
 // other code here for non-error case

而不是这样做:

 if (err) {
     res.status(500).end();
 } else {
    // other code here for non-error case
 }

这两者在功能上是相同的。第一个中的return用作快捷方式,以避免第二个中的else(不是我最喜欢的编码风格,但如果需要,则是合法的选择)。

仅供参考,在您显示的代码中,异步回调中的if (err) throw err;几乎从来都不是进行错误处理的正确方法,因为异常会进入某些异常基础结构,您无法捕获或执行此操作任何有智慧的东西。我知道你的问题不是关于这个,但是既然你正在学习node.js,我想我已经指出了这一点。在这种特殊情况下,您应该向客户端发送5xx错误状态。