我最近开始学习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);
答案 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错误状态。