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