根据前面的节点js调用3个函数

嘿伙计们一个快速的应用程序,通过邮政获得一个文件,而不是保存它,发送到另一台服务器,然后删除它。 这整个过程的工作原理,但如果我login程序生成的步骤我很困惑,因为我得到一个甚至在文件保存之前的删除outprint。 所以现在我想知道是否有可能一步步真正调用这3个函数。 因为在保存之前删除一个文件是不对的。 所以这里是我的代码,我希望你能帮助我。

server.post("/upload", function (req, res) { if (!req.files) { res.send("No file uploaded"); } else { //the Filepointer points to the whole File object which can contain multiple files var filePointer = req.files; console.log(filePointer); res.send("Files uploaded"); let key; for (key of Object.keys(filePointer)) { //single file uploaded so no json Object else get number of elements in the Array and loop over them if ((typeof filePointer[key][0]) === 'undefined') { //if theres only one File in the Object you can directly access the keys var file = filePointer[key]; //console.log("var is undefined"); console.log(file["name"]); var uploadPath = __dirname + "/uploads/" + file["name"]; console.log(uploadPath); saveFile(uploadPath, file); sendToTika(); deleteFile(uploadPath); } else { let index; for (index of Object.keys(filePointer[key])) { //with multiple files you need to access the keys with an indey i var file = filePointer[key][index]; console.log(file["name"]); var uploadPath = __dirname + "/uploads/" + file["name"]; console.log(uploadPath); saveFile(uploadPath, file); sendToTika(); deleteFile(uploadPath); } } } } }); server.listen(3000, function () { console.log("server is listening on port 3000"); }) function saveFile(UploadPath, file) { file.mv(UploadPath, function (err) { if (err) { console.log(err); } else { console.log("file uploaded and saved" + UploadPath); } }) } function sendToTika() { console.log("tika Function"); } //TODO: check if sync or async is better for this task function deleteFile(deletePath) { fs.unlink(deletePath, function (error) { if (error) { console.log(error); } console.log("deleted" + deletePath); }) } 

控制台日志是:

 tika Function deleted file uploaded and saved 

编辑:嘿,大家首先谢谢你所有的答案我会看看承诺!

尝试这个

 function saveFile(UploadPath, file) { return new Promise(function(resolve, reject) { file.mv(UploadPath, function (err) { if (err) { reject(err); console.log(err); } else { resolve(true); console.log("file uploaded and saved" + UploadPath); } }); }); } function deleteFile(deletePath) { return new Promise(function (resolve, reject) { fs.unlink(deletePath, function (error) { if (error) { reject(error); console.log(error); } else { resolve(true); console.log("deleted" + deletePath); } }); }); } 

最后,

 router.post('/upload', function(req, response){ saveFile(uploadPath, file).then((status) => { if(status){ sendToTika().then((result) => { if(result){ deleteFile(uploadPath); response.send({"status": true, "error": ''}) ; } else response.sendStatus(203); }).catch((err) => { response.sendStatus(203); }) } else response.sendStatus(203); }).catch((err) => { response.sendStatus(203); }) }); 

我希望这可以帮助你。

问题是函数saveFiledeleteFile使用asynchronous函数(callback函数)可以使用Promise

 function saveFile(UploadPath, file) { return new Promise(function(resolve, reject) { file.mv(UploadPath, function (err) { if (err) { reject(err); console.log(err); } else { resolve(); console.log("file uploaded and saved" + UploadPath); } }); }); } function deleteFile(deletePath) { return new Promise(function (resolve, reject) { fs.unlink(deletePath, function (error) { if (error) { reject(error); console.log(error); } else { resolve(); console.log("deleted" + deletePath); } }); }); } 

sendToTika函数使用相同的逻辑,并像这样调用函数:

 saveFile(uploadPath, file).then(() => { return sendToTika(); }).then(() => { return deleteFile(uploadPath); }).catch((err) => { // get the error here }) 

您还可以使用函数util.promisify返回返回promise的函数的一个版本: https : util.promisify