最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

运维笔记admin7浏览0评论

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

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

我最近开始学习node.js,我遇到了其中一章,以了解“上传文件”。正如你可以看到下面的代码(我已经对我怀疑的行进行评论),是否有必要写“return 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); 
回答如下:

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错误状态。

发布评论

评论列表(0)

  1. 暂无评论